【发布时间】:2009-04-03 11:19:41
【问题描述】:
我公司使用的 C# 应用程序从数据库表中获取正则表达式字符串,并将它们匹配到不同的文本文件中。问题是应用程序没有将 RegexOptions 设置为默认值,我需要使用“点匹配新行”模式。
引擎是否支持内联模式修饰符,就像
"A(?s)(.*?)(?-s)B"
或 PHP 中的“全局”模式修饰符
"/A(.*?)B/s"
【问题讨论】:
我公司使用的 C# 应用程序从数据库表中获取正则表达式字符串,并将它们匹配到不同的文本文件中。问题是应用程序没有将 RegexOptions 设置为默认值,我需要使用“点匹配新行”模式。
引擎是否支持内联模式修饰符,就像
"A(?s)(.*?)(?-s)B"
或 PHP 中的“全局”模式修饰符
"/A(.*?)B/s"
【问题讨论】:
除了 RegexOptions 编译器标志之外,没有直接等效于 /s 样式的修饰符,但是您可以通过在正则表达式的开头放置一个内联修饰符来获得相同的效果:
"(?s)A(.*?)B"
请注意,内联修饰符有两种形式。您在示例中使用的那个:
"A(?s)(.*?)(?-s)B"
...没有冒号。 (?s) 只是一个打开 DOTALL 模式的开关,直到 (?-s) 再次将其关闭。另一个带有冒号的版本实际上是一个非捕获组(?:...),内置了模式开关。模式开关只有在该组内的正则表达式部分处于控制状态时才有效。使用该版本,您的示例将变为
"A(?s:.*?)B"
...或者,如果您仍想使用捕获组:
"A(?s:(.*?))B"
您不想混淆这两个版本。如果您要像这样编写原始正则表达式:
"A(?s:)(.*?)(?-s:)B"
...它不会抛出异常,但不会按预期工作。 (?s:) 在 DOTALL 模式下将不匹配任何内容,而 (?-s:) 在非 DOTALL 模式下将匹配更多内容。
【讨论】:
当然可以(支持内联模式修饰符)!
只需使用模式修饰符(?s:) 开启“单行模式”,使点字符匹配换行符。
要检查正则表达式在 .NET 风格中的工作方式,我发现使用使用 .NET Regex 引擎的 RAD Regex Designer 很方便。
【讨论】:
【讨论】: