通配符与正则表达式

通配符与正则表达式均可以匹配符合某些格式的字符串,但是通配符一般用于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一下即可。