.NET正则表达式引擎是否支持内联模式修饰符?

时间:2009-04-03 11:19:42

标签: .net regex

我公司使用的C#应用​​程序从数据库表中获取正则表达式字符串,并在不同的文本文件上进行匹配。问题是应用程序没有将RegexOptions设置为默认值,我需要使用“Dot matches new line”模式。

引擎是否支持内联模式修改器

"A(?s)(.*?)(?-s)B"

或“全局”模式修饰符,如PHP

"/A(.*?)B/s"

3 个答案:

答案 0 :(得分:3)

除了RegexOptions编译器标志之外,/s样式的修饰符没有直接等价物,但是你可以通过在正则表达式的最开头放置一个内联修饰符来获得相同的效果:

"(?s)A(.*?)B"

请注意,内联修饰符有两种形式。您在示例中使用的那个:

"A(?s)(.*?)(?-s)B"

......没有冒号。 (?s)只是一个开关,可以打开DOTALL模式,直到(?-s)再次关闭它。带冒号的另一个版本实际上是一个非捕获组(?:...),内置模式开关。模式开关只有在该组内的正则表达式部分处于控制状态时才有效。使用该版本,您的示例将成为

"A(?s:.*?)B"

......或者,如果您仍想使用捕获组:

"A(?s:(.*?))B"

您不想混淆这两个版本。如果你要写这样的原始正则表达式:

"A(?s:)(.*?)(?-s:)B"

...它不会抛出异常,但它不会按预期工作。在{DOTALL模式下,(?s:)只会匹配任何内容,(?-s:)在非DOTALL模式下不会匹配任何内容。

答案 1 :(得分:2)

确实如此(支持内联模式修饰符)!

只需使用模式修饰符(?s:)打开“SingleLine模式”,使点字符与换行符匹配。

要检查正则表达式在.NET风格中的工作方式,我发现使用使用.NET Regex引擎的RAD Regex Designer非常方便。

答案 2 :(得分:1)

是。请参阅here

(?s:)

应该打开单线模式。