正则表示式是内置于其他语言的或软件产品里的“迷你”语言。
基本元字符
元字符 | 说明 |
---|---|
. | 匹配任意单个字符 |
| | 逻辑或操作符 |
[] | 匹配字符集合中的一个字符 |
[^] | 对字符集合求非 |
- | 定义一个区间(例如[A-Z]) |
\ | 对下一个字符进行转义 |
注意:
- [ ]用来定义一个字符集合
- 关于-
A-Z 表示匹配从A到Z的所有大写字母
a-z 表示匹配从a到z的所有小写字母
A-F表示匹配从A到F的大写字母
A-z,匹配从ASCII字符A到ASCII字符z的所有字符。
在定义一个字符区间的时候,一定要避免让这个区间的尾字符小于它的首字符(例如[3-1])。这种区间是没有意义的。 - ^是几个有着多种的元字符之一。只有当它出现在一个字符集合里(被放在[ ]之间)并紧跟在左方括号[的后面时,它才发挥“求非”作用。如果是在一个字符集合的外面并位于一个模式的开头,^将匹配字符串的开头。
数量元字符
元字符 | 说明 |
---|---|
? | 匹配前一个字符(子表达式)的零次或一次重复 |
* | 匹配前一个字符(子表达式)的零次或多次重复 |
*? | *的懒惰版本 |
+ | 匹配前一个字符(子表达式)的一次或多次重复 |
+? | +的懒惰版本 |
{n} | 匹配前一个字符(子表达式)的n次重复 |
{m,n} | 匹配前一个字符(子表达式)至少重复m次且至多n次重复 |
{n,} | 匹配前一个字符(子表达式)n次或更多次重复 |
{n,}? | {n,}的懒惰型版本 |
注意:
- 懒惰型,懒惰是指匹配尽可能少的字符,与“贪婪型”元字符的行为模式刚好相反。
贪婪型元字符 | 懒惰型元字符 |
---|---|
* | *? |
+ | +? |
{n,} | {n,}? |
位置元字符
元字符 | 说明 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的结束 |
\A | 匹配字符串的开头 |
\Z | 匹配字符串的结束 |
\< | 匹配单词的开头 |
\> | 匹配单词的结束 |
\b | 匹配单词边界(开头和结束) |
\B | \b的反义 |
特殊字符元字符
元字符 | 说明 |
---|---|
[\b] | 退格字符 |
\c | 匹配一个控制字符 |
\d | 匹配任意一个数字字符 |
\D | \d的反义 |
\w | 匹配任意字母数字字符或下划线字符 |
\W | \w的反义 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\s | 匹配一个空白字符 |
\S | \s的反义 |
\t | 制表符(Tab字符) |
\v | 垂直制表符 |
\x | 匹配一个十六进制数字 |
\0 | 匹配一个八进制数字 |
回溯引用和前后查找
元字符 | 说明 |
---|---|
() | 定义一个子表达式 |
\1 | 匹配第1个子表达式;\2代表第二个子表达式,依次类推 |
?= | 向前查找 |
?<= | 向后查找 |
?! | 负向前查找 |
? | 负向后查找 |
?() | 条件(if then) |
?()| | 条件(if then else) |
注意:
- ()子表达式一个非常重要的概念,子表达式允许多重嵌套
- 多重嵌套的的子表达式可以构造出功能极其强大的正则表达式,但会使得模式变得难以阅读和理解。
ip地址:
(((\d{1,2})|(1\d{2})|(2[2-4]\d)|(25[0-5])).){3}((\d{1,2})|(1\d{2})|(2[2-4]\d)|(25[0-5])) - 回溯引用为了解决例如html标签,找出其中所有的标题文字,标题有
<H1>到<h6>。
如果我们用
<[hH][1-6]>.*?</[hH][1-6]>
就会匹配出:
<h2>hello<h3>
这并不是我们想要的。
正确的
<[hH]([1-6])>.*?</[hH]\1>
用\1来引用([1-6])这个子表达式。这样就使得标签一一对应了,避免了h2和h3以组合形式匹配的问题。
4. 回溯引用是从1开始计数的(\1,\2等),第0个匹配(\0)可以用来代表整个正则表达式。
5. \1 对应着第1个子表达式,\5 表示第5个子表达式。这种语法存在一个严重的不足:如果子表达式的相对位置发生了变化,整个模式也许就不能再完成原来的工作,删除或添加子表达式的后果可能更为严重。
大小写转换
元字符 | 说明 |
---|---|
\E | 结束\L或\U转换 |
\l | 把下一个支持转换为小写 |
\L | 把后面的字符转换为小写,直到遇见\E为止 |
\u | 把一个字符转换为大写 |
\U | 把后面的字符转换为大写,直到遇见\E为止 |
匹配模式
元字符 | 说明 |
---|---|
(?m) | 分行模式 |
注意:
在使用时,(?m)必须出现在整个模式的最前面。
分行匹配模式将使得正则表达式引擎把行分隔符当作一个字符串分隔符来对待。
在分行模式下,^不仅匹配正常的字符串开头,还将匹配行分隔符(换行符)后面的开始位置。
类似的$不仅匹配正常的字符串结尾,还将匹配行分隔符(换行符)后面的结束位置。
有许多正则表达式实现不支持(?m)
参考书籍:
《正则表达式必知必会》