上一篇博客我们介绍了正则表达式的前两部分,现在我们来继续介绍后两部分。
3、Class/Range
Class是一组字符或者一个组,用中括号'[]'括起来。Range是放置在Class中的一组特殊的字符。例如我们想要找到所有后面跟着‘e’的从‘A’到‘L’的大写字母,则正则表达式为:
[A-L]e
Range的组成有字母[a-z]或者[A-Z],数字[0-9]。
如果想采用否定的范围,可以使用符号'^',例如想匹配'$'后面没有数字的情况,则正则表达式为:
$[^0-9]
注意符号'^'放在中括号里。
下面我们来做两个例子,所用到的文件grephelp.txt还是在上一篇博客中用到的文件,具体怎么生成请参考那篇文章。
例如我们想在文件中找到有字母'r、s、t、R、S、T'开头的'e',那么我们的命令为:
grep [r-tR-T]e grephelp.txt
结果如下:
可以看出找到的大多数情况都是小写字母‘r、s、t’后面跟着字母‘e’。
数字也可以通过Range进行搜索,如我们在文件中搜索搜索所有的数字,命令如下:
grep [0-9] grephelp.txt
结果如下:
我们还可以 设定否定的范围,使用符号'^'。如果我们想找到byte,但是要求byte跟在数字后面,则命令为:
grep [^0-9] byte grephelp.txt
我们还可以非常简单地执行不区分大小写的搜索,例如我们想找到文件中的‘-R’或者‘-r’,则命令如下:
grep \-[rR] grephelp.txt
注意使用转译字符‘\’,因为在这里破折号不是用来传递参数,而是正则表达式的文本。
这里也有一些特殊的字符集:
- [[:alnum:]] – same as [a-zA-Z0-9]
- [[:cntrl:]] - same as a Control Character
- [[:lower:]] - same as [a-z]
- [[:upper:]] - same as [A-Z]
- [[:space:]] - whitespace (spaces)
- [[:blank:]] - whitespace (spaces)
- [[:alpha:]] - same as [a-zA-Z]
- [[:digit:]] - same as [0-9]
- [[print:]] - any printable character
- [[punct:]] - punctuation characters
例如我们想要列出grep的所有参数,查看文本发现,grep的所有参数都是‘-[a-zA-Z],’,所有参数后面都有一个逗号,所以我们可以用以下命令来搜索:
grep '\-[[:alpha:]],' grephelp.txt
[[:alpha:]]等同于[a-zA-Z]。结果如下:
4、Quantifier
Quantifier 是一个特殊的字符,作用是用来表示其他的字符。这里有四种基本的Quantifier ,最后一种由三种用法。、:
1、* - 0 or more occurrences
2、+ - 1 or more occurrences
3、? - 0 or 1 occurrence
4、{#} - specific number of occurrences
5、{#,} - a specific number or more of occurrences
6、{#,#} - a range of occurrences from least to maximum
下面我们来看几个例子,加深理解。
如果我们想要搜索’nul‘、’null‘、’nulll‘,则我们的命令如下:
grep 'nu*l' grephelp.txt
星号’*‘表示下一个字符出现0次及以上。如果星号后面结论多个字符,则星号的功能失效。因为星号后面只能接一个字符。请记住星号可以找到0次出现。
如果我们搜索的字符至少出现一次,则我们需要使用加号’+‘。例如我们想要搜索“nul”并且字符“l”至少出现一次,则命令可以是:
grep 'nul\+' grephelp.txt
注意加号“+”必须使用转译字符,并且出现的字符实在前面。
如果我们想搜索“n”后面出现“u”和“l”的所有情况,则命令如下:
grep 'nu\+l\+' grephelp.txt
搜索的结果为“n”后面至少有一个“u”和至少有一个“l”。可能找到的结果有“nul”、“nuul”、“null”等。
文号“?”是搜索只出现0次或者1次的情况。命令:
grep 'nu\?l' grephelp.txt
的搜索结果为“nul”或者“nl”,字母“u”只出现0次或者1次。注意,问号“?”同样需要转译字符。
大括号{}用于指定搜多字符出现的次数,例如我们想找到“null”,则命令如下:
grep -E 'nul{2}' grephelp.txt
这里“l”出现两次,所以匹配的结果只能是“null”。该命令还可以写成:
grep 'null' grephelp.txt
注意命令grep使用大括号是必须使用“-E”参数。
如果我们搜索一个由三个元音组成的字符串,命令为:
grep -E '[aeiou]{3}' grephelp.txt
如果是搜索三个以上元音组成的字符串,命令为:
grep -E '[aeiou]{3,}' grephelp.txt
如果是有三个到8个元音组成的字符串,则命令为:
grep -E '[aeiou]{3,8}' grephelp.txt
由以上的例子我们可以看出,只需要指定出现次数的上下限即可。
正则表达式就谈论完了,希望同学们多多练习。