目录
正则表达式介绍
匹配模式
字符子集
行结束符
分组和引用
Unicode支持
正则表达式语法参考
替换表达式
替换表达式
匹配模式
匹配模式指得是正则表达式引擎将以何种模式匹配字符串。
模式名称 | 启用,禁用 | 缺省启用 | 说明 |
UNIX_LINES | (?d)启用,(?-d)禁用 | 是 | 启用Unix行模式。 在此模式下,只有 ' '被认为是行结束符。它会影响., ^, 和 $ 的行为。 |
CASE_INSENSITIVE | (?i)启用,(?-i)禁用 | 否 | 启用忽略大小写模式。 缺省时,忽略大小写模式只会影响 ASCII字符的匹配。 而Unicode范围的忽略大小写匹配需要通过 UNICODE_CASE 标志与本标志联合使用。 启用此模式会影响匹配性能。 |
COMMENTS | (?x)启用,(?-x)禁用 | 否 | 允许空格和注释出现在正则表达式中。 在此模式下,空格被忽略,以#开始的单行注释被忽略。 |
MULTILINE | (?m)启用,(?-m)禁用 | 是 | 启用多行模式。 In multiline mode the expressions ^ and $ match just after or just before, respectively, a line terminator or the end of the input sequence. By default these expressions only match at the beginning and the end of the entire input sequence. |
DOTALL | (?s)启用,(?-s)禁用 | 否 | 让.可以匹配行结束符。 在此模式下,元字符.可以匹配行结束符。缺省不允许如此匹配。 |
UNICODE_CASE | (?u)启用,(?-u)禁用 | 否 | Enables Unicode-aware case folding. When this flag is specified then case-insensitive matching, when enabled by the CASE_INSENSITIVE
flag, is done in a manner consistent with the Unicode Standard. By
default, case-insensitive matching assumes that only characters in the
US-ASCII charset are being matched. 启用此模式会影响性能。 |
CANON_EQ | (?c)启用,(?-c)禁用 | 否 | Enables canonical equivalence. When this flag is specified then two characters will be considered to match if, and only if, their full canonical decompositions match. The expression "au030A", for example, will match the string "?" when this flag is specified. By default, matching does not take canonical equivalence into account. 启用此模式会影响性能。 |
字符子集
��字符子集可以含有别的字符子集,并且可以通过联合操作符(缺省)和交集操作符(&&)实现组合。联合操作符表示某个子集匹配它的子子集所匹配的任意字符。交集操作符表明某个字符子集只匹配它的子子集都匹配的字符。
��字符子集所能够有的操作符的优先级如下,从高到低:
- 转义符x
- 成组符 [...]
- 区间符 a-z
- 联合符 [a-e][i-u]
- 交集符 [a-z&&[aeiou]]
��注意:在字符子集[]内部的语法根本不同于正则表达式其它部分中的语法。例如,在字符子集内部,正则表达式 . 失去了它原有的含义,而是成了一个匹配.的元字符。
行结束符
��行结束符是一个或两个字符序列,用以表明输入字符序列中一行的结束。下面的字符被认为是行结束符:
- 一个换行符(' ')。
- 一个回车符加上一个换行符(" ")。
- 一个单独的回车符(' ')。
- 代表下一行的字符('u0085')。
- 行分隔符('u2028'),Unicode中被定义。
- 一个分段符('u2029),Unicode中被定义。
��如果 UNIX_LINES 模式被启用,则只有换行符被认为是行结束符。
��如果 MULTILINE 模式被启用,。
分组和引用
��字符分组以它们的左括号的出现顺序来排序。例如在表达式((A)(B(C))),有四个分组:
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
��第0组永远表示表达式本身。
��分组采用这样的命名方式,是因为,在一次匹配过程中,正则表达式会被匹配多次。以前的匹配子序列有可能在将来被使用;或者在匹配结束时,程序有可能需要重新获得所有匹配的子字符序列。
��对于正则表达式中的某个分组而言,永远只保留最后匹配的字符序列。如果对某个分组匹配尝试失败,则会保留上次匹配成功的字符序列。例如,对于正则表达式(a(b)?)+而言,字符序列"aba",将会让分组2匹配的字符序列为"b"。
��以(?开始的分组,将不会计入分组数目,也不会被后续匹配所引用。
Unicode支持
��本正则表达式匹配引擎的实现遵循了《Unicode技术报告:Unicode正则表达式指南》,实现了该指南的第二层所需的功能,但是在细微处有一些简单语法修改。
��Unicode块(Block)和分类(Category)通过p和P通配苻表示。p{prop}匹配含有prop的输入序列,而P{prop}匹配不含有prop的输入序列。Unicode块通过前缀In表示,如p{InMongolian}。Unicode分类通过可选的前缀Is表示,因此p{L}和p{IsL}都代表Unicode分类 letters。Unicode块和分类都可以在正则表达式子集外部和内部使用。
��目前支持的Unicode块和分类是《Unicode标准,第三版》中所指定的块和分类。 Unicode块名称在《Unicode 字符数据库》的第14章被定义,文件名称叫Blocks-3.txt,但是名称中的空格被去掉了。例如"Basic Latin"成了"BasicLatin"。无论是标准化的还是非标准化的分类,都在该标准的第88页的第4-5表中被全部定义。
与Perl 5正则表达式语法对比
[TBD]
正则表达式参考
字符
正则表达式字符串 | 匹配的字符串 |
X | 字符X,包括 CJK ExtB 区汉字 |
\ | 反斜杠 |