Bash:使用正则表达式精确匹配字符串

Bash:使用正则表达式精确匹配字符串

我必须使用正则表达式对字符串进行精确匹配。我必须实现这个模式:toCheck 必须以 2 次出现的 $str1 开头,最多出现 1 次 $str2。如果 toCheck 与模式匹配,我必须在输出中写入 $toCheck:success,否则写入 $toCheck:failed。

我写了这个正则表达式:

regex="$1($1)+$2"

使用网站 regexr.com,我插入例如:

regex="lo(lo)ba"
toCheck="loloba"

这是一次成功。

在 regerx.com 上,本场比赛直到最后一刻:

toCheck="lolobaba"

但是,在我的 bash 代码中,它是成功的。

这是完整的代码:

toCheck="lolobaba"
regex="lo(lo)+ba"

if [[ $toCheck =~ $regex ]]; then

    echo "$toCheck:success" > output
else
    echo "$toCheck:failed" > output
fi

那么,问题是:如何使字符串和正则表达式完全匹配?

答案1

你成功了,因为正则表达式匹配了部分的。

如果你想要一个精确的匹配,您需要将模式锚定到行的开始和结束:regex="^lo(lo)+ba$"

  • 代表^字符串的开始:模式之前不能有任何内容
  • 代表$字符串的结尾:后面不能再加任何内容

在您的原始代码中,由于模式未固定,因此如果字符串的至少一部分验证了模式,则模式匹配不会关心之前或之后的内容。

答案2

括号是干什么用的?必须以 2x $str1 开头,以最多 1x $str2 结尾

所以就是

    if [[ $toCheck =~ ^$str1$str1($str2|)$ ]] ; then
        echo "$toCheck:success" > output
    else
        echo "$toCheck:failed" > output
    fi

相关内容