修饰符(Modifier)
修饰符(Modifer),用来控制正则表达式匹配过程中的特定行为的控制开关。
- m : multi-line, 多行模式。'^'和'$'将匹配字符串中每行的行首和行尾
- s : single line,单行模式。'^'和'$'仅匹配字符串的首/尾;'.'将匹配包括换行符在内的任一字符
- i : case-insensitive,忽略大小写。如"use locale"项有效,则大小写映射关系取决于"locale"
- x : extend( legibility),增强模式的可读性,允许在模式中使用空格和注释
- P : Preserve,保留匹配字符串,以便在匹配结束后可继续使用 ${^PREMATCH}, ${^MATCH}, 和${^POSTMATCH}
- g : 全局匹配,也即在字符串中找出所有与模式相匹配的部分
- c : 与'g'配合使用。当匹配失败或目标字符串被修改后,保存当前位置
扩展模式(Extend Pattern)
扩展模式提供了一些标准模式之外的特殊功能,形式为"(?...)"。
- (?#text) : 注释。若使用了"/x"选项,则括号中只需要以#号开始即可表示注释。')'被作为注释的结束标志,所以注释中不能包含')'
- (?pimsx-imsx) : 为械式随后的部分或未结束的模式分组设置选项p/i/m/s/x开关
- (?:pattern)或(?imsx-imsx:pattern) : 设置pattern为非捕获分组,不分配分组编号(因此不能使用后置引用),不保留实际匹配结果,可同时指定匹配选项开关(imsx)。
- (?|pattern) : 分枝重置(branch reset)。一般情况下,捕获分组的编号是由分组左括号在模式中出现的次序决定的。使用分枝重置表达式,则出现在表达式中的可选模式编号均重置为此表达式的编号。例如模式
(a)(?|x(y)z|(p(q)r)|(t)u(v))(z)中,分组(x(y)z),(p(q)r)和(t)的编号均为2,而(y),(q)和(v)编号为3,(z)编号为4。如在分枝重置表达式中使用了命名子模式,则同编号子模式的名称应相同,如(?|(?<a>x)(?<b>y)|(?<a>z)(?<b>w))。如在分枝重置表达式中为同一编号的子模式指定了不同名称,则模式编译时会给出告警,或出现非预期的匹配结果引用 - 环顾断言(Look-Around) Assertions
正则表达式进行模式匹配时,通常是从左至右分别扫描模式和字符串进行匹配测试。而环顾断言是指在相对当前匹配位置的前(look-ahead,右侧)或后(look-behind,左)侧进行子模式是否匹配的判断。环顾断言是一种零宽度(zero width)断言,也就是说,即使本部分子模式匹配成功,不会占用所匹配的字符串(即所匹配字符串还会用来和别的子模式进行匹配),匹配结果也不会出现在完整模式的匹配结果中(\g0或$&)。- (?=pattern) : 零宽度肯定前向断言(zero-width positive look-ahead assertion)。从当前匹配位置向前(右)对子模式进行匹配,且子模式匹配结果不出现在完整模式的匹配结果中。例,模式"\w+(?=\t)"匹配任何其后为制表符'\t'的单词。注意,非捕获组(?:pattern)仅仅是不单独保留子模式的匹配结果,但不影响其在模式整体匹配结果(\g0,$&)中的出现;而零宽肯定前向断言匹配成果后会将子模式匹配结果从整体匹配结果中移除
- (?!pattern) : 零宽度否定前向断言(zero-width negative look-ahead assertion)。当前匹配位置的右侧不能匹配指定子模式pattern。
例:"foo(?!bar)"匹配任何其后不为"bar"的"foo"。注意:模式"(?!foo)bar"看上去似乎像要匹配任何前面不是"foo"的bar,但事实上并非如此。这个模式会匹配任何"bar",因为"(?!foo)bar"中"子模式(?!foo)"的含义为“右侧不能为foo",而模式中指定了右侧子模式为"bar",只要子模式"bar"匹配成功,"?!foo)bar"必然成功。也就是说"(?!foo)bar"等同于"bar" - (?<=pattern)或\K : 零宽肯定后向断言(zero-width positive look-behind assertion)。从当前匹配位置向后(左)对子模式进行匹配判断,且即使匹配成功子模式匹配结果也不能出现在"\g0"或"$&"中。例如:"(?<=\t)\w+"匹配任何跟在制表符'\t'之后的单词。注意:向后/左查找模式的宽度必须为固定值(或在一个有限范内)。
'\K'是一种特殊形式的零宽后向断言,匹配引擎会"保存(Keep)"'\K'左侧的匹配结果,将其从最终完整匹配结果中移除。 - (?<!pattern) : 零宽度否定后向断言。如模式"(?<!bar)foo"匹配前面不是"bar"的"foo",向后查找模式宽度必须为固定值(或在有限范围内)
- 其他...