正则表达式本身,算是一种语言,其有自己一定的规则。
只不过每种其他语言在实现正则表达式的时候,却又对有些规则有些自己的定义。
此处,只是列出一些最基本,各个语言中都通用的一些规则。
表 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 | 匹配字符串的末尾 |
下面介绍一些通用的规则:
星号*,加号+,问号?,{m,n},都是属于贪婪原则,即在满足这些条件的情况下,尽可能地匹配多个。
而对应的后面加上一个问号?,变成:*?, +?, ??, {m,n}?就变成了最少原则,即,在满足前面的条件的情况下,尽量少地匹配。
其中??,个人很少用。
而最常用的是 .+?,表示任意字符,最少是1个,然后后面匹配尽量少的所出现的字符。
在正则表达式中,反斜杠\后面接一些特殊字符,表示该特殊字符,这些特殊是,上面所说过的:
.,^,$,*,+,?
对应的是:
\.,\^,\$,\*,\+,\?
以及反斜杠自己:
\\
其中如果是在中括号[]内,反斜杠加上对应的中括号[]和短横线-,即:
\[,\],\-
分别表示对应的字符本身。
在中括号之外,表示字符的开始;
在中括号之内,表示取反,比如常见的[^0-9]
比如[^5]表示除了数字5之外的所有字符。
尤其特别的是[^^]表示除了上尖括号字符本身之外的所有字符。