正则表达式Bash问题

时间:2015-12-30 01:08:23

标签: regex bash

我必须匹配仅重复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"。 我错了什么?

3 个答案:

答案 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中进行了测试。