我想捕获与正则表达式匹配的字符串部分(请参阅下面的代码)。例如给出: apply plugin: 'java'
我想捕获 java
。
我整理了以下正则表达式。当我执行下面的代码(在 Linux 或 Mac OS 上)时,找到了一个匹配项,但 BASH_REMATCH 数组为空(即长度为零)。
有人知道正则表达式和/或其应用程序有什么问题吗?
regex="^[[:space:]]*apply[[:space:]]*plugin:[[:space:]]*'([[:alpha:]]+)'[[:space:]]*$"
if [[ "$line" =~ $regex ]]; then
echo "Match count is ${#BASH_REMATCH[@]}."
echo ${BASH_REMATCH[1]}
else
echo "No match."
fi
最佳答案
我无法重现 macOS 上发布的内容。您可能有一个调试陷阱或类似的设置。
为了帮助调试此问题,请编辑您的问题以包括:
- 您运行的完整脚本(即包括填充
$line
的任何内容) - 用于运行它的完整命令以及完整输出
- bash xtrace(
-x
)输出
我使用您评论中的信息将您的代码扩展为 MCVE:
$ cat myfile
regex="^[[:space:]]*apply[[:space:]]*plugin:[[:space:]]*'([[:alpha:]]+)'[[:space:]]*$"
line="apply plugin: 'java'"
if [[ "$line" =~ $regex ]]; then
echo "Match count is ${#BASH_REMATCH[@]}."
echo ${BASH_REMATCH[1]}
else
echo "No match."
fi
然后我像这样运行它并得到了预期的输出:
$ bash myfile
Match count is 2.
java
这是带有调试信息的输出:
$ bash -x myfile
+ regex='^[[:space:]]*apply[[:space:]]*plugin:[[:space:]]*'\''([[:alpha:]]+)'\''[[:space:]]*$'
+ line='apply plugin: '\''java'\'''
+ [[ apply plugin: 'java' =~ ^[[:space:]]*apply[[:space:]]*plugin:[[:space:]]*'([[:alpha:]]+)'[[:space:]]*$ ]]
+ echo 'Match count is 2.'
Match count is 2.
+ echo java
java
这是系统信息:
$ uname -a && bash --version
Darwin hostname 17.4.0 Darwin Kernel Version 17.4.0: Sun Dec 17 09:19:54 PST 2017; root:xnu-4570.41.2~1/RELEASE_X86_64 x86_64
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.
我可以添加重现相同的结果,例如将 trap '[[ a =~ b ]]' DEBUG
添加到脚本中。如果您正在执行类似的操作,它将显示在 -x
输出中。
关于regex - Bash 正则表达式捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48795154/