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