我有一个像"(?<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])
-要求当前位置右边没有]
和一个字字符。