为了方便测试正则表达式对连续次数匹配的使用,我们创建测试文件regex.txt,内容如下:
aaa
bbb bb bbbbbb
hello world helloo hello
cccc cccc cccccccddd
cc dd ccc ccccccrrrr
cc ccc cccc
abc abc abcc abcde
ddd dddddddddd dddd2222
例:要匹配到含有cc的行
方法一:grep "cc" regex.txt -n 方法二:grep "c\{2\}" regex.txt -n
显示效果一致
语法:\{x\}表示之前的字符连续出现x次将会被匹配到
注意:如果字符连续出现的次数大于指定的次数,也是可以被匹配到的
问题:只想匹配出现2个c的行怎么办?
方法一:grep "\<c\{2\}\>" regex.txt -n
方法二:grep "\<cc\>" regex.txt -n
方法三:grep "\<c\{2,2\}\>" regex.txt -n
上述方式使用"\<\>"单词定界符,锚定词首与锚定词尾。
语法:“\{x,y\}”表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到
例:grep "h*" regex.txt -n
如上图所示,”h*”表示h连续出现任意次数,即可被匹配到,所以,第3行高亮显示了。但是其他行为什么也被打印出来了呢?这是因为*表示连续出现任意次数,包括0次。其他行中,根本不包含字母h,换句话说就是,h连续出现了0次,所以其他行也符合条件,最终也被grep输出了
语法:
在通配符中,*表示匹配任意长度的任意字符。
在正则表达式中,*表示之前的字符连续出现任意次数(包括0次),不要与通配符中的*搞混淆了。
正则表达式中,”.”表示匹配任意单个字符,例如:
正则表达式中,使用”.*”表示任意长度的任意字符;例如,
\?
表示匹配其前面的字符0或1次,换句话说,就是前面的字符要么没有,要么有一个。
其它行匹配出来是因为前面的w可以出现0次。
\+
表示匹配其前面的字符至少1次,换句话说,就是前面的字符必须有至少一个
总结:
* | 表示前面的字符连续出现任意次,包括0次。 |
. | 表示任意单个字符。 |
.* | 表示任意长度的任意字符,与通配符中的*的意思相同。 |
\? | 表示匹配其前面的字符0或1次 |
\+ | 表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。 |
\{n\} | 表示前面的字符连续出现n次,将会被匹配到。 |
\{x,y\} | 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,即可被匹配到。 |
\{,n\} | 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。 |
\{n,\} | 表示之前的字符连续出现至少n次,才会被匹配到. |