我必须使用正则表达式对字符串进行精确匹配。我必须实现这个模式: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