教程 > 正则表达式 > 修饰符 阅读:54

模式修饰符

在正则表达式内指定模式


通常,匹配模式是在正则表达式之外指定的。在编程语言中,我们可以将它们作为标志传递给regex构造函数,或将它们附加到regex中。

有时,工具或语言不提供指定匹配选项的功能。Java中String.matches()方法没有像Pattern.compile()那样带有用于匹配选项的参数。或者,正则表达式风格可能支持未公开为外部标志的匹配模式。即使基础PCRE库比本教程中讨论的任何其他模式具有更多的匹配模式,R中的regex函数也将ignore.case作为其唯一选项。

在这种情况下,可以将以下模式修饰符添加到正则表达式的开头。要指定多种模式,只需像(?ismx)中那样将它们放在一起。 * (?i)使正则表达式不区分大小写。 * (?c)使正则表达式区分大小写。仅由Tcl支持。  * (?x)开启自由间距模式。  * (?t)关闭自由间距模式。仅受Tcl支持。 * (?xx)也会在字符类中打开自由间距模式。由Perl 5.26和PCRE2 10.30支持。 

  • "单行模式"的(?s)使点与所有字符匹配,包括换行符。Ruby或JavaScript不支持。在Tcl中,(?s)还会使^和$仅在字符串的开头和结尾匹配。
  •  (?m)(用于"多行模式")使^和$在目标字符串中每行的开头和结尾处都匹配。在Ruby中,(?m)使点与所有字符匹配,而不会影响在Ruby中每行的开头和结尾始终匹配的^和$。在Tcl中,(?m)还可以防止点与换行符匹配。
  •  Tcl中的(?p)使^$在每行的开头和结尾处匹配,并使点匹配换行。 
  •  Tcl中的(?w)使^$仅在目标字符串的开头和结尾处匹配,并防止点与换行符匹配。 
  •  (?n)将所有未命名的组转换为非捕获组。仅.NET,XRegExp和JGsoft支持。在Tcl中,(?n)与(?m)相同。
  •  (?J)允许重复的组名。仅PCRE和使用它的语言(如Delphi,PHP和R支持。
  •  (?U)启用“不均匀模式”,该模式切换贪婪和惰性量词的语法。因此(?U)a*是惰性的,而(?U)a*?是贪婪的。仅PCRE和使用它的语言支持。强烈建议不要使用它,因为它会混淆标准量词语法的含义。
  •  (?d)对应于Java中的UNIX_LINES ,这使得点.,^和$仅将换行符\n视为换行符,而不是识别Unicode标准中的所有换行符。它们是否匹配(在换行符处)取决于(?s)和(?m)。
  •  (?b)使Tcl将正则表达式解释为POSIX BRE。
  •  (?e)使Tcl将正则表达式解释为POSIX ERE。
  •  (?q)使Tcl将正则表达式解释为文字字符串(减去(?q)字符)。
  •  如果该组合不是有效的正则表达式token,则(?X)会使带有反斜杠的转义字母成为错误。仅受PCRE和使用它的语言支持。 

    仅对正则表达式的一部分打开和关闭模式


现代的regex风格允许我们仅将修饰符应用于正则表达式的一部分。如果在正则表达式的中间插入修饰符(?ism),则修饰符仅适用于修饰符右侧的正则表达式部分。有了这些支持,我们可以在模式前面加上减号来关闭它们。减号后的所有模式将关闭。例如(?i-sm)打开不区分大小写的功能,并同时关闭单行模式和多行模式。

不能仅对正则表达式的一部分应用修饰符的正则引擎会将正则表达式中间的修饰符视为错误。Python就是一个例外。在Python中,将修饰符放在正则表达式的中间会影响整个正则表达式。所以在Python, (?i)caselesscaseless(?i)都是不区分大小写。在所有其他正则引擎中,将模式修饰符放在后面要么无效,要么为错误。

我们可以快速测试使用的正则表达式引擎是如何处理模式修饰符。正则表达式(?i)te(?-i)st应该匹配test和TEst ,但不能匹配teST或TEST 。

modifier span


这个概念真的不知道应该用什么中文来表示。我们下面就介绍它的作用,具体要怎么用中文表示,各位看官自己根据作用可以随便。

我们可以使用一个modifier span来代替使用两个修饰符(一个用于打开一个选项,另一个用于将其关闭)。(?i)caseless(?-i)cased(?i)caseless等效于(?i)caseless(?-i:cased)caseless。此语法类似于非捕获组(?:group)的语法。我们可以将非捕获组视为不更改任何修饰符的修饰符范围。但是,有些语言(例如JavaScript,Python和Tcl)支持非捕获组,即使它们不支持modifier span。像非捕获组一样,modifier span不会创建反向引用。

Modifier span受所有正则表达式引擎的支持,这些允许我们在正则表达式的中间使用模式修饰符。这些语言包括JGsoft,.NET,Java,Perl和PCRE,PHP,Delphi和R。  

查看笔记

扫码一下
查看教程更方便