1 概念
- 英文名:Regular Expression(
regex
) - 是一个字符串,用以匹配一系列符合某个句法规则的字符串。
注意:要按照字符来理解正则表达式。如:
^cat
应理解为:匹配 行开始,紧接着一个c,紧接着一个a,紧接着一个t的文本。
不要理解为:匹配以cat开头的行。(后续为简化说法,还会采用该说法,但应按字符理解)
2 语法规则
-
字符组
[...]
:允许使用者列出在某处期望匹配的字符。(或)
如:[abc]
表示匹配a或b或c字符。- 字符组元字符
-
:表示一个范围,如[0-9]
表示所有数字,gr[ae]y
匹配gray或grey。^
:表示排除,如[^0-9]
表示匹配排除数字后的所有字符。
注意:字符组里面和外面,元字符的意义是不一样的。
- 字符组元字符
-
元字符(字符组外面)
^
:代表行的开始$
:代表行的结束$1
、$2
:代表前面匹配成功的字符串。.
:匹配任意字符。()
:表示一个元素,可以是字符也可以是字符串。|
:或,多选结构,如:grey|gray
,也可以表示成gr(a|e)y
。?
:可选项,作用于前一紧邻元素,如colou?r
表示u可有可没有。+
:计数,表示前一紧邻元素至少出现一次。*
:计数,表示前一紧邻元素出现任意多次或未出现。{min,max}
:表示前一紧邻元素出现次数范围。\char
:转义符,其作用的char元字符会失去特殊含义,如:\\
,\t
,\r
,\d
,\.
等\<
:单词分界符,单词开始位置,如\<cat
匹配cat开头的单词。\>
:单词分界符,单词结束位置。(部分egrep不支持单词分界符)
3 常用文本结构示例
- 任意英文字符:
[!-~]
(包括数字、字母和英文特殊字符) - 变量名:
[a-zA-Z_][a-zA-Z_0-9]*
(变量名不能以数字开头) - 引号内字符串:
"[^"]*"
(排除双引号) - 美元金额:
\$[0-9]+(\.[0-9]*)?
(可能包含小数) - 邮箱地址:
\w+@[0-9a-zA-Z]+(\.[a-z]{2,3})+
- URL:
\<http://[a-z0-9][-a-z0-9_.:]+/[-a-z0-9_:@&?=+,./~*%$]*\.html?\>
- 时刻:
([01]?[0-9]|2[0-3]):[0-5][0-9]
(24小时制)
字符 | 含义 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
x | 代表字符x(区分大小写) | ||||||||||||||||||
\ | 转义字符
| ||||||||||||||||||
[abc] | 表示范围,代表的是字符a或b或c | ||||||||||||||||||
^ |
| ||||||||||||||||||
$ | 表示行的结尾,如[0-9]$ 表示匹配字符需要是[0-9]结尾 | ||||||||||||||||||
- | 连续字符表示,如[0-9]表示0到9的数字,[a-zA-Z]表示a到z和A-Z的字符 | ||||||||||||||||||
. | 代表任意字符 | ||||||||||||||||||
数量词 |
|
4 环视功能
- 环视(lookaround)结构不匹配任何字符,只匹配文本中的特定位置。
- 顺序环视——从左至右查看文本
- 肯定顺序环视:
(?=...)
能够匹配右侧文本。
如:正则表达式(?=Jeffrey)
,匹配标记的位置:
且(?=Jeffrey)Jeff
和Jeff(?=rey)
是等价的。
- 否定顺序环视:
(?!...)
不能匹配右侧文本。
- 肯定顺序环视:
- 逆序环视——从右至左查看文本
-
肯定逆序环视:
?<=...
能够匹配左侧文本。 -
否定逆序环视:
?<!...
不能匹配左侧文本。
环视结构示例1:将"see Jeffs book"修改为"see Jeff’s book"s/(?<=\bJeff)(?=s\b)/'/g //等价于: s/(?=s\b)(?<=\bJeff)/'/g
环视结构示例2:将"The popolation is 7084442151 in the earth!"中的数字以逗号分开,即7,084,442,151
s/(\d)(?=(\d\d\d)+(?!\d))/$1,/g
环视结构示例3:包含特殊字符、数字和字母,长度为8~16位,其中特殊字符可以不存在,数字和字母最少一个。(类似密码格式验证)
^(?=.*[0-9a-zA-Z])[!-~]{8,16}$
-