regex - bash 正则表达式中的匹配组

标签 regex bash

<分区>

在 bash 中我有以下内容:

REGEX="(1.0.0|2.0.0)"
declare -a arr=("A:1.0.0" "B:1.0.0" "C:2.0.0" "D:2.0.1")
for i in "${arr[@]}"
do
    echo "Found: $i"
    if [[ "$i"=~"${REGEX}" ]]; then
        echo "$i matches: ${REGEX}"
    else
        echo "$i DOES NOT match: ${REGEX}"
    fi   
done

我假设对于 D:2.0.1 它将打印 ...DOES NOT match... 但它会打印

Found: A:1.0.0
A:1.0.0 matches: (1.0.0|2.0.0)
Found: B:1.0.0
B:1.0.0 matches: (1.0.0|2.0.0)
Found: C:2.0.0
C:2.0.0 matches: (1.0.0|2.0.0)
Found: D:2.0.1
D:2.0.1 matches: (1.0.0|2.0.0)

那么我的 REGEX 组模式有什么问题?指定这样的组模式在其他语言中也能正常工作——例如像时髦的。

最佳答案

您在正则表达式匹配表达式中的开头有一个拼写错误

if [[ "$i"=~"${REGEX}" ]]; then

应该这样写

if [[ $i =~ ${REGEX} ]]; then

这意味着您应该永远引用您的正则表达式。为了让它理解扩展正则表达式支持 (ERE) 中的 | 运算符,您需要让它理解它不是在双引号下处理的文字字符串。


不推荐

但是如果你仍然想引用你的正则表达式字符串 - bash 3.2 introduced a compatibility option compat31 (under New Features in Bash 1.l)它将 bash 正则表达式引用行为恢复到支持正则表达式字符串引用的 3.1。您只需要通过扩展 shell 选项启用它

shopt -s compat31

现在用引号运行它

if [[ $i =~ "${REGEX}" ]]; then

关于regex - bash 正则表达式中的匹配组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49010380/

相关文章:

python - 带有日语字符的 re.sub

windows - 在打开 Emacs 时自定义窗口

linux - 为什么 Bash 字符串下标中的空格在这里很重要?

c - 没有 "export"的挡泥板

linux - 如何使用命令 "find"在目录中查找包含特定字符串的文件?

Bash:如何从输出中删除 xargs 产生的错误消息?

正则表达式匹配 URL

python - 检查字符串是否匹配模式

javascript - 从 HTML/文本中提取 URL,但如果 URL 仅显示部分内容,如 "/secondpage.html"?

javascript - 如何编写正则表达式以删除 HTMl 缩小器的标签和单词之间的空格