[英]Regular expression Bash issue
我不得不匹配的仅小写字符组成的字符串重复2次,例如ballball
或printprint
。 例如,单词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.