繁体   English   中英

正则表达式Bash问题

[英]Regular expression Bash issue

我不得不匹配的仅小写字符组成的字符串重复2次,例如ballballprintprint 例如,单词ball不被接受,因为它没有重复2次。 因此,我有以下代码:

read input
expr='^(([a-z]*){2})$'

if [[ $input =~ $expr ]]; then

echo "OK string"
      exit 0

fi

exit 10

但这不起作用,例如,如果我插入ball ,脚本将显示"OK string" 我怎么了

并非所有的Bash版本本机都支持正则表达式中的反向引用。 如果没有,则可以使用外部工具,例如grep

read input
re='^\([a-z]\+\)\1$'

if grep -q "$re" <<< "$input"; then
    echo "OK string"
    exit 0
fi

exit 1

grep -q是静默的,并且如果存在匹配项,则具有成功的退出状态。 注意grep必须如何转义(+) grep -E会理解()而不会转义。)

另外,我用+替换了您的* ,因此我们不匹配空字符串。

或者:您的要求意味着匹配的字符串有两个相同的一半,因此我们可以检查其中是否有任何正则表达式:

read input
half=$(( ${#input} / 2 ))
if (( half > 0 )) && [[ ${input:0:$half} = ${input:$half} ]]; then
    echo "OK string"
fi

这使用子串扩展 ; 第一项检查是确保空字符串不匹配。

您的要求是匹配由两个重复单词组成的字符串。 只需检查字符串的前半部分是否等于其余部分,即可轻松实现。 无需使用正则表达式...

$ var="byebye" && len=$((${#var}/2))
$ test ${var:0:$len} = ${var:$len} && { echo ok ; } || echo no  
ok
$ var="abcdef" && len=$((${#var}/2))
$ test ${var:0:$len} = ${var:$len} && { echo ok ; } || echo no  
no

正则表达式[az] *将匹配任何字母数字或空字符串。 ([az]*){2}将与其中任何两个匹配。 因此, ^(([az]*){2})$将匹配包含零个或多个字母数字字符的任何字符串。

使用@hwnd的建议(将{2}替换为\\1 )将对两个相同的字符串进行匹配。

注意:您将需要较新版本的bash。 在bash 4.3.11中测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM