正则表达式

正则表达式

一、概述

  正则表达式Regular Expression,常简写为 regexregexpRE),又称正则表示式正则表示法规则表达式常规表示法,是计算机科学的一个概念。
  正则表达式使用单个字符串描述匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
  正则表达式这个概念最初是由 Unix 中的工具软件(例如 sedgrep)普及开的。

二、基本规则

  一个正则表达式通常被称为一个模式pattern),为用来描述或者匹配一系列匹配某个句法规则的字符串

  • 选择(亦称为:或集合)
    竖线 | 分隔备选方案。例如 gray|grey,可以匹配 “gray” 或 “grey” 。
  • 分组
    括号 () 用于定义运算符的范围和优先级。例如 gr(a|e)y 等价于 gray|grey(grand)?father 匹配 fathergrandfather
  • 数量限定
    元素(例如标记、字符或组)之后的量词指定允许在前的元素重复多少次。如:*+{n}{min, max}等等。
  • 通配符
    例如 . 可以匹配除 “\r” “\n” 之外的任何单个字符任意字符,而 * 通配符匹配零个或多个字符。
  • 中介字符(亦称:中介字元)
    代表范围的字段,例如 \w 可以匹配 A-Za-z0-9_ 等。

三、语法对照表

推荐使用 Regex Match Tracer 软件做正则测试
付费版:http://www.regex-match-tracer.com/downloads
免费版:http://www.regexlab.com/zh/mtracer/download.htm

符号说明
|选择运算符,没有包围在()里,其范围是整个正则表达式。例如:z|food能匹配 “z” 或 “food”。(?:z|f)ood 则匹配 “zood” 或 “food”。
\转义字符,将下一个字符标记为一个特殊字符(File Format Escape)、或一个原义字符(Identity Escape,有 ^$()*+?.[\{|共计12个)、或一个向后引用(backreferences)、或一个八进制转义符。例如,n 匹配字符 “n”。\n 匹配一个换行符。\\ 匹配 “\” 而 \( 则匹配 “(”。
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline(多行匹配) 属性,^ 也匹配换行(“\n” 或 “\r” )之后的位置。
$匹配输入字符串的结束位置。如果设置了 RegExp 对象的 Multiline(多行匹配) 属性,$ 也匹配换行(“\n” 或 “\r” )之前的位置。
?问号表示前面的元素出现零次或一次。例如:colou?r 可匹配 “color” 和 “colour” 。? 等价于 {0,1}非贪心量化(Non-greedy quantifiers):当该字符紧跟在任何一个其他重复修饰符(*+?{n}{n,}{n,m})后面时,匹配模式是非贪婪。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,o+? 将匹配单个“o”,而 o+ 将匹配所有“o”。
*星号表示前面的元素出现零次或多次。例如:ab*c 匹配 “ac”、“abc”、“abbc”、“abbbc”等。* 等价于 {0,}
+加号表示前面元素出现一次或多次。例如:ab+c 匹配 “abc”、“abbc”、“abbbc”等,但不匹配 “ac”。+ 等价于 {1,}
{n}前一项恰好匹配 n n n 次( n ⩾ 0 n \geqslant 0 n0)。例如:o{2} 不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o
{min,}前一项匹配最少 m i n min min 次或更多次( m i n ⩾ 0 min \geqslant 0 min0)。例如:o{2,} 不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有oo{1,} 等价于 o+o{0,} 则等价于 o*
{,max}前一项匹配最多 m a x max max 次数。( m a x ⩾ 0 max \geqslant 0 max0
{min,max}前一项至少匹配 m i n min min 次,但不超过 m a x max max 次( m i n ⩾ 0 , m a x ⩾ 0 , m i n ⩽ m a x min \geqslant 0, max \geqslant 0, min \leqslant max min0,max0,minmax)。例如:o{1,3} 将匹配“fooooood”中的前三个 oo{0,1} 等价于 o?。请注意在逗号和两个数之间不能有空格
.点号匹配除“\r”“\n”之外的任何单个字符。要匹配包括“\r”“\n”在内的任何字符,请使用像 (.|\r|\n) 的模式。
()将一系列阵列元素组合成一个元素。匹配 (abc)+ 并获取这一匹配的一次或多次“abc”子字符串,可带数量后缀。要匹配圆括号字符,请使用 \(\)
(?:)?: 代表将 () 内的组设置为非捕获组。例如:(?:pattern) 匹配 pattern 但不获取匹配的子字符串,也就是说这是一个非获取匹配,不存储匹配的子字符串用于向后引用。这在使用或字符 (|) 来组合一个模式的各个部分是很有用。例如:industr(?:y|ies) 就是一个比 industry|industries更简略的表达式。
(?=)正向肯定预查look ahead positive assert),(?=pattern) 在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如:Windows(?=95|98|NT|2000) 能匹配 “Windows2000”中的 “Windows”,但不能匹配 “Windows3.1” 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!)正向否定预查negative assert),(?!pattern) 在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如:Windows(?!95|98|NT|2000) 能匹配 “Windows3.1”中的 “Windows”,但不能匹配Windows2000” 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
(?<=)反向look behind肯定预查,与正向肯定预查类似,只是方向相反。例如:(?<=95|98|NT|2000)Windows 能匹配“2000Windows” 中的 “Windows”,但不能匹配 “3.1Windows” 中的 “Windows”。
(?<!)反向否定预查,与正向否定预查类似只是方向相反。例如:(?<!95|98|NT|2000)Windows 能匹配 “3.1Windows” 中的 “Windows”,但不能匹配2000Windows” 中的 “Windows” 。
[]字符集合character class)。匹配所包含的任意一个字符。例如:[abc] 可以匹配“plain” 中的 “a”。特殊字符仅有反斜杆 \ 保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符 ^ 如果出现在首位则表示排除型(取反)字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述,如 [a-z] 代表匹配从 a 到 z 的所有字母即所有的小写字母;如果出现在首位(或末尾)则仅作为普通字符。右方括号应转义出现,也可以作为首位字符出现。
[^xyz]排除型字符集合(negated character classes)。匹配未列出的任意字符。例如,[^abc] 可以匹配 “plain” 中的 “plin” 。
[a-z]字符范围。匹配指定范围内的任意字符。例如:[a-z] 可以匹配 “a” 到 “z” 范围内的任意小写字母字符。
[A-Z] 代表大写字母
[0-9] 代表数字
其他访问字符表示方式类似
[^a-z]排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,[^a-z] 可以匹配任何 不在 “a” 到 “z” 范围内的任意字符
[:name:]增加命名字符类(named character class)中的字符到表达式。只能用于方括号表达式。
注:未验证,慎用
[=elt=]增加当前 locale下排序(collate)等价于字符“elt”的元素。例如,[=a=] 可能会增加ä、á、à、ă、ắ、ằ、ẵ、ẳ、â、ấ、ầ、ẫ、ẩ、ǎ、å、ǻ、ä、ǟ、ã、ȧ、ǡ、ą、ā、ả、ȁ、ȃ、ạ、ặ、ậ、ḁ、ⱥ、ᶏ、ɐ、ɑ 。只能用于方括号表达式。
注:未验证,慎用
[.elt.]增加排序元素(collation element)elt到表达式中。这是因为某些排序元素由多个字符组成。例如,29个字母表的西班牙语, "CH"作为单个字母排在字母C之后,因此会产生如此排序“cinco, credo, chispa”。只能用于方括号表达式。
注:未验证,慎用
\b匹配一个单词边界也就是指单词和空格间的位置。例如:er\b 可以匹配 “never” 中的“er”,但不能匹配verb” 中的 “er”。
\B匹配非单词边界er\B 能匹配 “verb” 中的 “er”,但不能匹配 “never” 中的 “er”。
\cx匹配由 x 指明的控制字符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 “c”字符。控制字符的值等于 x 的值最低5比特(即对32的余数(10进制))。例如,\cM 匹配一个 Control-M回车符\ca 等效于 \u0001, \cb 等效于 \u0002, 等等
\d匹配一个数字字符。等价于 [0-9] 。注意 Unicode 正则表达式会匹配全角数字字符。
\D匹配一个非数字字符。等价于 [^0-9]
\f匹配一个换页符。等价于 \x0c\cL
\n匹配一个换行符。等价于 \x0a\cJ
\r匹配一个回车符。等价于 \x0d\cM
\s匹配任何空白字符,包括空格制表符换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
\t匹配一个制表符(Table)。等价于 \x09\cI
\v匹配一个垂直制表符。等价于 \x0b\cK
\w匹配包括下划线的任何单词字符。等价于 [A-Za-z0-9_]。注意Unicode正则表达式会匹配中文字符。
\W匹配任何非单词字符。等价于 [^A-Za-z0-9_]
\xnn十六进制转义字符序列。匹配两个十六进制数字 n n nn nn 表示的字符。例如,\x41 匹配 “A”。正则表达式中可以使用 ASCII 编码。
\num向后引用(back-reference)一个子字符串(substring),该子字符串与正则表达式的第 n u m num num 个用括号围起来的捕获群(capture group)子表达式(subexpression)匹配。其中 n u m num num 是从1 开始的十进制正整数,其上限是由匹配字符串中有多少个子串决定。例如:(.)\1 匹配两个连续的相同字符,等价于 (.)(.),因为这里的子串只有一个,所以 n u m num num 的上限是 1。(AA)(BB)(CC)\2 可匹配 “AABBCCBBAAAA” 中的 “AABBCCBB”,其中 (AA) 为第 1 组,(BB) 为第 2 组,(CC) 为第 3 组, n u m num num 的上限为 3。这里的 \2 代表引用 第 2 组 (BB),即(AA)(BB)(CC)\2 等价于 (AA)(BB)(CC)(BB)
\n标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字(0-7),则 n 为一个八进制转义值。
注:八进制验证未通过,慎用
\nm3位八进制数字,标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有nm个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字m的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字(0-7),则 \nm 将匹配八进制转义值 nm。
注:验证不通过,慎用
\nml如果n为八进制数字(0-3),且 m 和 l 均为八进制数字(0-7),则匹配八进制转义值nml。
注:验证不通过,慎用
\unUnicode 转义字符序列。其中 n n n 是一个用四个十六进制数字表示的 Unicode 字符。例如,\u00A9 匹配著作权符号 ©

四、运算符优先级

优先权符号
最高\
()(?:)(?=)[]
*+?{n}{n,}{n,m}
^$、中介字符(\w\d 等表示范围的字符)
次最低串接,即相邻字符连接在一起(例如普通字符 abc
最低|

参考资料
[1] 正则表达式:https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
[2] Regular expression:https://en.wikipedia.org/wiki/Regular_expression

欢迎关注个人公众号,实时推送最新博文!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值