通配符与正则表达式
通配符与正则表达式均可以匹配符合某些格式的字符串,但是通配符一般用于 Linux 的 shell 下,而正则表达式适用范围则更广,不仅 Linux 的 shell 下支持(grep、awk、sed 等工具),而且很多程序语言也支持(Java,Python 等)。
通配符
- 通配符
?
匹配文件名中的单个字符,而通配符*
匹配零个或多个字符。像data?.dat
这样的模式将查找下列文件:
1 | data1.dat |
使用 *
字符代替 ?
字符扩大了找到的文件的数量。data*.dat
匹配下列所有文件:1
2
3
4
5
6data.dat
data1.dat
data2.dat
data12.dat
datax.dat
dataXYZ.dat
正则表达式 (regular expression)
特殊字符
特殊字符就是有特殊含义的字符,下面的表格将列出一些常用的特殊字符,如果要匹配这些特殊字符可以在其之前加上反斜杠 \
特殊字符 | 含义 |
---|---|
. | 匹配除了 \n 以外的任何单个字符,与通配符中的 ? 作用相同 |
? | 匹配前面的子表达式零次或一次,如.? 表示没有字符或一个任意字符,he(hee)? 表示 he 或 hehee |
+ | 匹配前面的子表达式一次或多次,如.+ 表示一个或一个以上的任意字符 |
* | 匹配前面的子表达式零次或多次,如.* 表示一个或一个以上的任意字符 |
[ ] | 匹配中括号内任意一个字符,如 [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 一下即可。