我必须匹配仅重复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"
。
我错了什么?
答案 0 :(得分:2)
并非所有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
这使用Substring Expansion;第一项检查是确保空字符串不匹配。
答案 1 :(得分:0)
您的要求是匹配由两个重复单词组成的字符串。只需检查字符串的前半部分是否等于剩余部分,这很容易做到。无需使用正则表达式...
prediction=model.predict(predictor)
print prediction
答案 2 :(得分:-1)
正则表达式[a-z] *将匹配任何字母数字或空字符串。
([a-z]*){2}
将匹配其中两个。
因此,^(([a-z]*){2})$
将匹配包含零个或多个字母数字字符的任何字符串。
使用@hwnd中的建议(将{2}
替换为\1
)将对两个相同的字符串强制执行匹配。
N.B:你需要一个相当新版本的bash。在bash 4.3.11中进行了测试。