0

我想为 ex 匹配一个或多个事件。使用 expr 的废话。

这行得通。

$ expr "blahblahblah" : 'blahblah'
8

这个正则表达式有什么问题?

$ expr "blahblahblah" : '\(blah\)\+'
blah

我想要匹配的字符数。

4

3 回答 3

3

由于您的问题已标记为bash,因此在现代版本的 shell 中,有比 expr 更好的设施,它们完全符合您的要求:

$ re='(blah)+'
$ [[ foo_blahblah_bar =~ $re ]] && echo "${#BASH_REMATCH[0]}"
8
于 2012-07-23T16:44:47.893 回答
1

首先,你需要\(\)代替()\+代替+. 但这还不是全部。

您不能同时使用组()并获取匹配字符串的长度。

模式匹配返回在 ( 和 ) 或 null 之间匹配的字符串;如果 ( 和 ) 未使用,则返回匹配的字符数或 0。

您必须使用wc来获取字符串的长度:

$ expr "blahblahblahblah" : '\(\(blah\)\+\)' | wc -c
17

或使用参数扩展:

$ m=$(expr "blahblahblahblah" : '\(\(blah\)\+\)') 
$ echo ${#m}
16

(wc -c 也计算行尾,因此存在差异)。

但是如果你可以编写不带组的正则表达式,你会得到长度:

$ expr "blahhhhhbl" : "blah\+"
8
于 2012-07-23T16:44:40.143 回答
0

使用 sed:

echo "blahblahblah" | sed -n 's!\(\(blah\)*\).*!\1!p' | wc -c
于 2012-07-23T16:52:48.130 回答