通配符与正则表达式

通配符与正则表达式均可以匹配符合某些格式的字符串,但是通配符一般用于 Linux 的 shell 下,而正则表达式适用范围则更广,不仅 Linux 的 shell 下支持(grep、awk、sed 等工具),而且很多程序语言也支持(Java,Python 等)。

通配符

  • 通配符 ? 匹配文件名中的单个字符,而通配符 * 匹配零个或多个字符。像 data?.dat 这样的模式将查找下列文件:
1
2
3
4
data1.dat  
data2.dat
datax.dat
dataN.dat

使用 * 字符代替 ? 字符扩大了找到的文件的数量。data*.dat 匹配下列所有文件:

1
2
3
4
5
6
data.dat  
data1.dat
data2.dat
data12.dat
datax.dat
dataXYZ.dat

正则表达式 (regular expression)

特殊字符

特殊字符就是有特殊含义的字符,下面的表格将列出一些常用的特殊字符,如果要匹配这些特殊字符可以在其之前加上反斜杠 \

特殊字符含义
.匹配除了 \n 以外的任何单个字符,与通配符中的 ? 作用相同
匹配前面的子表达式零次或一次,如.? 表示没有字符或一个任意字符,he(hee)? 表示 hehehee
+匹配前面的子表达式一次或多次,如.+ 表示一个或一个以上的任意字符
*匹配前面的子表达式零次或多次,如.* 表示一个或一个以上的任意字符
[ ]匹配中括号内任意一个字符,如 [Pp]ython 表示 Python 或 python,[a-z] 匹配任何一个小写字母,[a-zA-Z0-9] 匹配任何一个字母或数字
( )标记一个字表达式的开始和结束
{ }花括号里面放的是限定符表达式,用来匹配前面指定的表达式重复的次数,如等价于 {0,1}+ 等价于 {1,}
^在方括号 [] 内使用表示不包含方括号内任意元素,其余情况均表示匹配输入字符串的起始位置
$匹配输入字符串的末尾
表示字符和空格间的位置(也叫作字边界)
任何其他非字边界的位置
匹配包括下划线的任何单词字符。等价于 '[A-Za-z0-9_ ]'
匹配任何非单词字符。等价于 '[^A-Za-z0-9_ ]
匹配一个数字字符。等价于 [0-9]
匹配一个非数字字符。等价于 [^0-9]

贪婪匹配和非贪婪匹配

对于字符串 <H1>Chapter 1 – Introduction to Regular Expressions</H1>

  • 如果匹配的正则表达式为 <(.*)>,则为贪婪匹配,匹配出来的内容为 H1>Chapter 1 – Introduction to Regular Expressions</H1,正则表达式没有括号时 (即为 <.*>),匹配的内容为 <H1>Chapter 1 – Introduction to Regular Expressions</H1>
  • 如果匹配的正则表达式为 <(.*?)>,则为非贪婪匹配,匹配出来的内容为 H1/H1

这样应该可以看出非贪婪匹配(又称最小匹配)和贪婪匹配的区别了,贪婪匹配就是匹配符合正则表达式的尽可能多的内容,而非贪婪匹配则是匹配符合正则表达式的第一个子串(如果有多个符合)。

一些例子

正则表达式匹配内容
[^\\\/\^]除了 (\)(/)(^) 之外的所有字符
[^\"\']除了双引号 (") 和单引号 (') 之外的所有字符
.{2}所有的两个字符
两个制表符
^a{2,}$以两个或两个以上的 a 开头的字符串
^a{2,4}$aa,aaa 或 aaaa
1{1,}$所有的正数
^\-{0,1}[0-9]{1,}$所有的整数
^\-?[0-9]*\.?[0-9]+$所有小数

关于正则表达式的一些基本概念就是上面这些,当然正则表达式的功能比上面所说的还要强大得多。只是无需记住所有的特性,在需要用到的时候 google 一下即可。