expr字符串匹配

时间:2012-07-23 16:38:27

标签: regex bash

我希望匹配一个或多个出现。使用expr。使用blah。

这很有效。

$ expr "blahblahblah" : 'blahblah'
8

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

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

我想要匹配的字符数。

3 个答案:

答案 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