1.2. 正则表达式的通用语法

正则表达式本身,算是一种语言,其有自己一定的规则。

只不过每种其他语言在实现正则表达式的时候,却又对有些规则有些自己的定义。

此处,只是列出一些最基本,各个语言中都通用的一些规则。

表 1.1. 正则表达式中通用字符匹配规则

特殊字符 等价于 含义解释 提示
.   表示任意字符(除了换行符\n以外的任意单个字符)  
^   表示字符串的开始  
$   表示字符串行末或换行符之前  
* {0,无穷多个} 0或多个前面出现的正则表达式 贪婪原则,即尽量匹配尽可能多个
+ {1,无穷多个} 1或多个前面出现的正则表达式 贪婪原则,即尽量匹配尽可能多个
?      
*?,+?,??   使*,+,?尽可能少的匹配 最少原则
{m}   匹配m个前面出现的正则表达式  
{m,n}   匹配最少m个,最多n个前面出现的正则表达式 贪婪原则,即尽量匹配尽可能多个
{m,n}?   匹配最少m个,最多n个前面前出现的 最少原则
\   后接那些特殊字符,表示该字符;或者后接已经定义好的特殊含义的序列 对于已经定义好的特殊序列,详细解释参考表 1.4 “正则表达式中已定义的转义字符序列”
[]   指定所要匹配的字符集,可以列出单个字符;或者是一个字符范围,起始和结束字符之间用短横线-分割;  
|   A|B,其中A和B可以是任意正则表达式,其中也支持更多的抑或A|B|C|…  
(...)   匹配括号内的字符串 实现分组功能,用于后期获得对应不同分组中的字符串

正则中,还有一些,相对比较通用的标记(flag),又称修饰符(modifier),限定符,或者说不同的模式

表 1.2. 正则表达式中通用的限定符

限定符类型/模式 英文叫法 含义解释
忽略大小写模式 ignore case mode 默认不加此参数,是大小写区分的。加了此参数,则不区分大小写
单行模式 single line mode 默认'.'是不匹配回车换行的。加了此参数,则使得'.'也匹配回车换行,这就使得原本,中间包含了换行的,多行的字符串,变成了单行的效果。
多行模式 multiple line mode 默认情况是:^只匹配,整个(中间包含了回车换行的,多行的)字符串的开始,同理,$只匹配整个字符串的末尾。而加上次参数,则^也匹配每个'\n'==newline=换行符之后的那个位置,表示下一行的开始,同理,$也匹配,换行符之前的那个位置,表示之前一行的结束位置
松散模式 verbose mode/relax regular expression/ignore Whitespace 默认的正则,都是连续的写在一起的,可以叫做,紧凑型的正则。加上此参数,则运行你在,原先是紧凑的正则中间,加上一些空格或tab,用于对齐格式,以及一些注释内容,目的在于方便别人看懂你写的正则,所以,相对紧凑型的写法,叫做,松散正则。此时,松散正则里面的空白符,即回车,换行,tab,都被忽略,如果想要表达回车换行本身,需要转义。松散正则中的注释,当然在解析的时候,也会被忽略掉的。
区域模式 locale mode 根据当前的local不同,会影响到其他一些正则的含义,比如\w, \W, \b, \B, \s and \S
Unicode模式 unicode mode 根据Unicode字符编码去匹配,会影响到其他一些正则的含义,比如\w, \W, \b, \B, \d, \D, \s and \S

相应的,不同语言中,上述的限定符写法,也不太相同。总结如下

表 1.3. 正则表达式中通用的限定符的不同语言中的写法

不同语言/限定符写法 忽略大小写模式 单行模式 多行模式 松散模式 区域模式 Unicode模式
C# RegexOptions.IgnoreCase RegexOptions.Singleline RegexOptions.Multiline RegexOptions.IgnorePatternWhitespace RegexOptions.CultureInvariant(此点待确认) 未知
Pyton re.IGNORECASE/re.I re.DOTALL/re.S re.MULTILINE/re.M re.VERBOSE/re.X re.LOCALE/re.L re.UNICODE/re.U
Perl i s m x l u

表 1.4. 正则表达式中已定义的转义字符序列

特殊序列/已定义的字符含义 等价于 含义解释 提示
\数字   表示前面用括号()括起来的某个组group  
\A   表示字符串的开始  
\b   匹配空字符,但只是,一个单词word的,除了开始或者结束位置的,的空字符  
\B \b含义取反 0或多个前面出现的正则表达式  
\d [0-9] 匹配单个数字(0到9中的某个数字)  
\D [0-9]的取反 非数字的单个字符,即除了0-9之外的任意单个字符  
\s [ \t\n\r\f\v] 匹配单个空白字符,包括空格,水平制表符\t,回车\r,换行\n,换页\f,垂直制表符\v 英文单词一般叫做blankspace,简称space,所以此处的s就是space的意思
\S \s的含义取反 匹配非空白字符之外的单个字符  
\w [a-zA-Z0-9_] 匹配单个的任何字符,数字,下划线  
\W \w的含义取反 匹配单个的,非字母数字下划线之外的字符  
\Z   匹配字符串的末尾  

下面介绍一些通用的规则:

1.2.1. 关于贪婪原则和最少原则

星号*,加号+,问号?,{m,n},都是属于贪婪原则,即在满足这些条件的情况下,尽可能地匹配多个。

而对应的后面加上一个问号?,变成:*?, +?, ??, {m,n}?就变成了最少原则,即,在满足前面的条件的情况下,尽量少地匹配。

其中??,个人很少用。

而最常用的是 .+?,表示任意字符,最少是1个,然后后面匹配尽量少的所出现的字符。

1.2.2. 反斜杠

在正则表达式中,反斜杠\后面接一些特殊字符,表示该特殊字符,这些特殊是,上面所说过的:

.,^,$,*,+,?

对应的是:

\.,\^,\$,\*,\+,\?

以及反斜杠自己:

\\

其中如果是在中括号[]内,反斜杠加上对应的中括号[]和短横线-,即:

\[,\],\-

分别表示对应的字符本身。

1.2.3. 上尖括号^

在中括号之外,表示字符的开始;

在中括号之内,表示取反,比如常见的[^0-9]

比如[^5]表示除了数字5之外的所有字符。

尤其特别的是[^^]表示除了上尖括号字符本身之外的所有字符。

1.2.4. 中括号[]内的+,*,(,)

中括号[]内的加号+,星号*,括号(,)表示对应字符本身,就不是特殊字符了。