基础的正则表达式:
1、"."(一个点)符号
点符号用于匹配除换行符之外的任意一个字符。
例如:r.t可以匹配rot、rut,但是不能匹配root,若使用r..t就可以匹配root、runt、r t(中间是两个空格)等。
例,搜索 “包含L,紧跟着两个字符,后面再接N“ 的行
2、"*"符号
"*"符号用于匹配前一个字符0次或任意多次,比如ab*,可以匹配a、ab、abb等。"*"号经常和"."符号加在一起使用。比如".*"代表任意长度的不包含换行的字符。
例,搜索连续的L字母紧跟着字母N的行。
"."结合"*",如‘L.*N’,代表搜索包含字母L,后面紧跟任意长度的字符,再跟一个字母L的行。
3、“\{N,M\}” 符号
虽然 “*” 可用于重复匹配前一个字符,但却不能精确地控制匹配的重复次数,使用 “\{N,M}\” 符号则能更加灵活地控制字符的重复次数,典型的有:
\{n\},匹配前面的字符n次。例(匹配包含root的行(r和t中包含两个o)):
\{n,\},匹配前面的字符至少n次以上(含n次):
\{n,m\},匹配前面的字符n到m次:
4、“^”符号
匹配开头的字符,比如“^root”,匹配的是以字母root开始的行
5、“$”符号
匹配结尾的字符,比如“abc$”,匹配的是以字母abc结尾的行。如果是 "^$"则代表该行为空,因为^和$间什么都没有。
例,匹配以r开头,中间有一串任意字符,以h结尾的行。
6、“[]” 符号
这是一对方括号,用于匹配方括号内出现的任一字符。比如单项选择题的答案,可能是A,B,C,D选项中的任意一种,那么用正则表达式表示[ABCD]。如果遇到比较大的范围的匹配,比如要匹配任意一个小写字母,则用 [a-z] 表示,使用 “-” 号做范围限定。如要匹配所以字母,则写出[a-zA-Z]。一定要注意,这列的 "-" 的作用不是充当一个字符。
如果要匹配不是大写字母A,B,C,D的字符,用 "^"符号,这个符号在[]中,则代表取反。正则表达式写出[^A-D]。
例,匹配手机号 "^1\[38][0-9]\{9\}",
这个例子表示手机号第一位为1,所以写出 "^1";
第二位可能是3,也可能是8,表示为 "[38]";
后面连续9个任意数字,表示为 "[0-9]\{9\}" ;
7、“\” 符号
固定电话一般为021-88888888,中间由 “-” 分隔,或021 88888888,中间由" " 空格分开。匹配电话号码,我们应该使用"[]"来匹配,但是我们不能够这么写" [ -]",因为 "-" 放到 "[]" 中有特别的含义。为了其作为一个字符的本意,就要使用转义符号 "\",我们可以对特殊的字符进行“转义”,让它只代表字符本身,因此这里的写法就应该是 [\ \-]。
之前了解到 “.*” 代表的是任意长度的不包含换行的重复字符。但是如果想要匹配任意长度的点号,这时可以使用转义字符 "\.*"。如果想要对 "\" 符号进行转义,就应该写成 "\\" 。
8、"\<" 符号和 "\>"符号
这2个符号分别用于界定单词的左边界和右边界。如"\<hello" 用于匹配以"hello"开头的单词;而 "hello\>" 则用于匹配以"hello"结尾的单词。还可以使用它们的组合 "\<\>" 用于精确匹配一个字符串。所以 "\<hello\>" 可精确匹配单词“hello”,而不是helloword等。例:
9、"\d" 符号
匹配一个数字,等价于[0-9],使用grep匹配这种正则表达式时可能遇到无法匹配的问题。
10、"\b" 符号
匹配单词的边界,比如 "\bhello\b" 可精确匹配"hello"单词。
11、"\B" 符号
匹配非单词的边界,比如hello\B可以匹配"helloworld" 中的"hello"。
12、"\w" 符号
匹配字母、数字、下划线,等价于[a-zA-Z0-9]。
13、"\W" 符号
匹配非字母、非数字、非下划线,等价于[^a-zA-Z0-9]。
14、"\n" 符号: 匹配一个换行符。
15、"\r" 符号: 匹配一个回车符。
16、"\t" 符号: 匹配一个制表符。
17、"\f" 符号: 匹配一个换页符。
18、"\s"符号: 匹配任何空白字符。
19、"\S"符号: 匹配任何非空白字符。
扩展的正则表达式:
顾名思义,扩展的正则表达式一定是针对基础正则表达式的一些补充,实际上,扩展正则表达式比基础正则表达式多了几个重要的符号。不过要注意点是,在使用这些扩展符号时,需要使用egrep命令。
1、"?" 符号
"?" 符号用于匹配前一个字符0次或1次,所以 "ro?t"仅能匹配rot或rt。
2、"+" 符号
"+" 符号用于匹配前一个字符1次以上(包括一次),所以"ro_t",就可以匹配rot、root、rooot等。
3、"|" 符号
"|" 符号是"或"的意思,即多种可能的罗列,彼此间是一种分支关系。比如说有些地区固定电话的区号是4位数,有些地方是3位数,这样针对不同的区号就有不同的固定电话的表达方式。
几种固定电话的正则表达式:
4、"()" 符号
"()"符号通常需要和"|"符号联合使用,用于枚举一系列可替换的字符。比如说固定的电话的区号和电话号码之间,可能用"-"符号或者用一个空格连接,用于匹配的正则表达式如:
虽然以上两种写法没有本质的不同,因为 "()" 和 "|" 可以和"[]"相互混用,但是在某些场景下,"()" 和 "|" 可以做的更多,比如像hard、hold、hood等这类开头和结尾的字母都一样的单词,要匹配这些必须使用"()" 和 "|" 了。
通配符:
通配符是一种特殊的语句,主要包含 "*" 和 "?" 号(还有 "{}" 、"^" 、"!")。主要用来模糊搜索文件,使用它替代一个或多个真正的字符,尤其是在不知道或不确定完整的文件名时,用来匹配符合条件的文件。
1、"*" 符号
这里的 "*" 就是提到的第一个通配符,代表0个或多个字符。*.doc就是指所有以 .doc结尾的文件。如果想要找的文档是以A开头,则可用A*.doc来查找。在Linux中,列出当前目录中是否存在以.doc结尾的文件,可使用一下命令:
2、"?" 符号
如果要列出以字母A开头、但是只有两个字母的文件名、以.doc结尾的文件,就需要使用"?"了。当它作为通配符使用时,代表的是任意一个字符。如:
3、"{}" 符号
"{}" 可拥有匹配所有括号内包含的以逗号隔开的字符。例如,下面列出了所有以字母A、B、C开头,以.doc结尾的文件:
以上两种方法都能满足题意,但是如果要列出以字母AB或者CD开头、以.doc结尾的文件,就只能用 "{}" 了。
"{}"还支持嵌套的通配。以"{x,y}" 为例,如果x和y各自本身也是通配符,则就变得更强大了
4、"^" 符号和 "!" 符号
这两个符号往往和 "[]" 一起使用,当出现在 "[]"中的时候,代表取反。所以 [^A](或[!A])代表不是A。