我希望匹配一个或多个出现。使用expr。使用blah。
这很有效。
$ expr "blahblahblah" : 'blahblah'
8
这个正则表达式有什么问题?
$ expr "blahblahblah" : '\(blah\)\+'
blah
我想要匹配的字符数。
答案 0 :(得分:2)
由于您的问题被标记为bash
,因此在现代版本的shell中有比expr更好的功能,它们可以完全满足您的需求:
$ re='(blah)+'
$ [[ foo_blahblah_bar =~ $re ]] && echo "${#BASH_REMATCH[0]}"
8
答案 1 :(得分:1)
首先,您需要\(\)
而不是()
和\+
而不是+
。
但这不是全部。
您不能使用群组()
并同时获取匹配字符串的长度。
模式匹配返回(和)之间匹配的字符串或null;如果不使用if(和),它们将返回匹配的字符数或0。
您必须使用wc
来获取字符串的长度:
$ expr "blahblahblahblah" : '\(\(blah\)\+\)' | wc -c
17
或使用参数扩展:
$ m=$(expr "blahblahblahblah" : '\(\(blah\)\+\)')
$ echo ${#m}
16
(wc -c也计算行尾,因此差异)。
但是如果你可以编写没有组的正则表达式,你得到长度:
$ expr "blahhhhhbl" : "blah\+"
8
答案 2 :(得分:0)
使用sed:
echo "blahblahblah" | sed -n 's!\(\(blah\)*\).*!\1!p' | wc -c