正则表达式(Regular Expression):计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
匹配单个字符
匹配固定单个字符
任何单个大小写字母、数字以及特殊字符都可以匹配其自身。
m
-> ‘m’
它们可以组合使用。
mm
-> ‘mm’
匹配任意单个字符
使用.
可以匹配任意的单个字符,包括它本身,但一般不包括换行符。
.i.
-> ‘nix’, ‘six’…\.
->.
匹配字符组
使用[abc]
来匹配多个字符中的一个。
r[abc]
-> ‘ra’, ‘rb’, ‘rc’
字符区间
使用[a-z]
来匹配a到z之间的字符。(如果需要匹配-
则需要使用\-
)
注意:这里依赖ASCII码的大小,起始字符必须小于结束字符。
[a-c]
-> ‘a’, ‘b’, ‘c’[a-z0-9]
-> ‘a’, ‘8’…
使用[^a-z]
来匹配这个范围之外的字符。
匹配特殊字符
匹配元字符
使用转义字符\
来匹配元字符。
\[0\]
->[0]
匹配空字符
\r
-> 回车符\n
-> 换行符\t
-> 制表符\d
==[0-9]
\w
==[a-zA-Z0-9_]
\W
==[^a-zA-Z0-9_]
\s
==[\f\n\r\t\v]
\S
==[^\f\n\r\t\v]
匹配多个字符
匹配一个或多个字符
在单字符表达式后面加上+
,表示匹配一个或多个这样的字符。单字符表达式包括单个固定字符、单个任意字符、以及特殊字符。
j+
-> ‘j’, ‘jj’, ‘jjj’…\w+@\w+\.\w+
-> 电子邮件地址
匹配零个或多个字符
在单字符表达式后面加上*
,表示匹配零个或多个这样的字符。
var\d*
-> ‘var’, ‘var123’…
匹配零个或一个字符
在单字符表达式后面加上?
,表示匹配零个或一个这样的字符。
nix1?
-> ‘nix’, ‘nix1’
+
,*
,?
都是元字符,匹配它们本身时需要转义。
匹配指定个数字
在单字符表达式后面加上{n1-n2}
,n1和n2是两个整数,表示匹配n1到n2个这样的字符。
n1可以为0,表示0个字符,n2可以置空,表示多个字符。
z{1-3}
-> ‘z’, ‘zz’, ‘zzz’ha{0-2}
-> ‘h’, ‘ha’, ‘haa’
贪婪匹配和惰性匹配
贪婪匹配:匹配尽量多的字符,直到无法匹配。
惰性匹配:匹配尽量少的字符,一旦符合条件就立即停止。
正则表达式默认贪婪匹配,如果需要惰性匹配,在元字符后面加?
若目标文本中含有
haaa
ha+
-> ‘haaa’ha+?
-> ‘ha’a{3}
== ‘a{3}?’
匹配边界
单词边界
\b
表示单词边界
\bcat\b
-> ‘cat’
边界是相对的,对于字符,边界是空格、分隔符、逗号、句号;对于空格、分隔符、逗号、句号,普通字符就是边界。
匹配非边界字符
使用\B
来匹配不在边界的字符。
匹配文本边界
使用^
来表示全部字符之首(包括空格)。
使用$
来表示全部字符之末。
匹配子模式
子模式
使用()
来将一个复杂表达式转换成子模式。
将一个复杂表达式转化成子模式之后,这个表达式就可以被当成一个单字符表达式来使用。这样就可以对其使用?
,{n1, n2}
等表达式。
(ha)+
-> ‘haha’, ‘hahaha’…
“或”匹配
使用|
来连接两个表达式,将匹配两个表达式中任意一个所匹配的字符。
(19|20)\d{2}
-> 1900~2099中所有整数
后向引用
使用\数字
来进行后向引用,\1
表示前面第一个子模式匹配的内容。
(of|up) \1
-> ‘of of’, ‘up up’ 而不能匹配’up of’或者’of up’(\w+)\1
-> 连续且重复一次的单词<h([1-6])>.*?</h\1>
-><h1>blah</h1>
默认情况下,每个子模式都有一个名称。起名规则是:从左至右以左括号出现的顺序为准,从1开始命名。
可以使用下面的语法自己给子模式命名
(?<name>exp)
相关常用语法:
(exp)
匹配exp,并捕获文本到自动命名的组里(?<name>exp)
匹配exp,并捕获文本到名称为name的组里(?:exp)
匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
要匹配所有扩展名为app的文件名,而又不希望结果中包含app,可以使用\b\w+(?\.app)
(?=exp)
匹配exp前面的位置(?<=exp)
匹配exp后面的位置(?!exp)
匹配后面跟的不是exp的位置(?<!exp)
匹配前面不是exp的位置
文字替换
替换时可以使用\数字
或$
来引用子模式匹配的内容。跟正则表达式的具体实现有关。
假如有文本:
nixwang.com
使用查找语句:(\w+).com
替换语句:$1.net
替换结果:nixwang.net