正则表达式学习笔记 - 图1 正则表达式(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