代码之家  ›  专栏  ›  技术社区  ›  knoopx

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

  •  4
  • knoopx  · 技术社区  · 17 年前

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

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

    或PHP中的“全局”模式修饰符

    "/A(.*?)B/s"
    
    3 回复  |  直到 17 年前
        1
  •  3
  •   Alan Moore Chris Ballance    17 年前

    除了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模式下匹配更多的nothing。

        2
  •  2
  •   Cerebrus    17 年前

    当然可以(支持内联模式修改器)!

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

    为了检查正则表达式在.NET风格中如何工作,我发现使用 RAD Regex Designer 它使用.NET正则表达式引擎。

        3
  •  1
  •   Jeff Moser    17 年前

    对看见 here .

    (?s:)
    

    应打开单线模式。