不复制必须的模式部分的正则表达式组的绑定可选性



我有一个像"(?<opening>[)?(?<body>w+)(?<closing>])?"的正则表达式。
这是在。net中。
目前打开和关闭都是可选的和独立的。
所以问题是:是否有可能使closing匹配只有当opening遇到,否则视为不匹配?

目前它匹配所有可能的变体:body,[body,body],[body].
但我的目标是匹配body[body]

注:我知道这是可以通过((?<opening>[)(?<body>w+)(?<closing>])|(?<body>w+))
,但我实际的<body>图案是相当大和复杂的复制像这样

对于当前的场景,您可以使用

(?:(?<o>[)|(?<![))b(?<body>w+)(?(o)(?<c>])|(?![]w]))

参见. net正则表达式演示。细节:

  • (?:(?<o>[)|(?<![))
  • b-一个字边界(它在这里工作,因为下一个模式部分匹配一个字字符)
  • (?<body>w+)- Group "body":一个或多个字字符
  • (?(o)(?<c>])|(?![]w]))-一个条件结构,如果Group "o"堆栈不是空的,
    • (?<c>])匹配并捕获到组"a]char,
    • |- or else (if Group "o"不匹配)
    • (?![]w])-要求当前位置右边没有]和一个字字符。

相关内容

  • 没有找到相关文章

最新更新