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