Linux正则表达式-重复出现的字符


星号(*)元字符表示它前面的正则表达式可以出现零次或多次。也就是说,如果它修改了单个字符,那么该字符可以在那里也可以不在那里,并且如果它在那里,那可能会不止出现一个。可以使用星号元字符匹配出现在引号中的单词。
□"*hypertext"*□

不管单词"hypertext"是否出现在引号中都会被匹配。

而且,如果由星号修饰的字符确实存在,那么有可能出现多次。例如,我们来看一系列数字:
1
5
10
50
100
500
1000
5000

正则表达式[15]0*将匹配所有的行,而且则表达式[15]00*匹配除前两行以外的所有的行。第一个0是字面值,但是第二个由星号修饰,意味着它可能出现也可能不出现。常用类似的方法匹配一个或多个(而不是0个或多个)空格,可以使用下面的表达式来完成:
□□*
当星号元字符前面有句点元字符时,匹配任意数目的字符。这可用于标识两个固定的字符串之间的字符的跨度。如果想要匹配引号中的任意字符串,可以指定:
".*"
它匹配该行上的第一个引号和最后一个引号之间的所有字符以及引号。使用".*"进行匹配的范围总是最大的。目前它似乎并不重要,但是一旦学习替换被匹配的字符串时这就很重要了。

作为另一个例子,一对尖括号标记语言中用来包围格式化指令的普通符号,标记语言如HTML。通过指定下面的表达式可以打印带有标记的所有的行:

$ grep ' <.*>' sample

当星号用于修饰字符类时,则可以匹配类中的任意数目的字符。例如下面5行的示例文件:
I can do it
I cannot do it
I can not do it
I can' t do it
I cant do it
如果我们想要匹配以上语句中的否定语句,但不匹配肯定语句,可以使用下面的正则表达式:
can[ no' ]*t
星号使得类中的任意字符以任意顺序匹配,并且匹配任意多次的出现。如下所示:

$ grep "can[ no' ]*t" sample
I cannot do it
I can not do it
I can' t do it
I cant do it

有4个成功和1个失败(肯定语句)。注意如果正则表达式试图匹配字符串"can"和"t"之间的任意个字符,如下例所示:
can.*t
它将匹配所有的行。

技术术语"closure (闭合)"有匹配"零次或多次"的能力。egrep和awk使用的元字符扩展集提供了几个非常有用的closure 的变化。加号(+)匹配前面的正则表达式的一次或多次出现。前面匹配一个或多个空格的示例可以简化为:
□+
元字符加号可以被认为是"至少一个"的前导字符。事实上,它和许多人使用的"*"号相对应。

问号(?)匹配零次或一次出现。例如,在前面的示例中,我们使用正则表达式匹配"80286" 、"80386" 和" 80486" 。如果我们还想匹配字符串"8086" ,可以用egrep 或awk编写正则表达式:
80[234]?86

它匹配"80"后面跟有一个2 ,一个3 ,一个4,或者没有字符,然后跟字符串"86"。不要混淆表达式中的?和shell中的?通配符。Shell 中的?表示单个字符,等效于正则表达式中的"."

相关内容