找到两个左括号缺少两个右括号

Finding two open brackets missing two closing brackets

我想要一个正则表达式来匹配任何以两个左括号开头但没有两个匹配的右括号的单词。例如:

Good afternoon Mr. [[Insured.InsuredName]] - Your policy 
[[Insured.CurrentPolicy is out of date.

在这种情况下 "Insured.CurrentPolicy" 会被抓到。我是 lookahead/lookbehinds 的新人。感谢您的帮助。

您可以尝试使用

\[\[(?>(\p{Lu}\p{L}*(?:\.\p{Lu}\p{L}*)*))(?!]])

regex demo

解释:

  • \[\[ - 两个 [ 符号
  • (?> - 一个原子组的开始,它将防止回溯到它的子模式中,这样如果匹配失败后的前瞻,整个正则表达式可能 return 没有匹配
  • (\p{Lu}\p{L}*(?:\.\p{Lu}\p{L}*)*) - 第 1 组捕获
    • \p{Lu}\p{L}* - 一个大写字母后跟 0+ 个任意字母(注意:将 \p{L}* 替换为 \w* 以匹配字母数字和下划线字符)
    • (?:\.\p{Lu}\p{L}*)* - 零个或多个点序列后跟大写字母后跟 0+ 任何字母(与上述注释相同)。
  • ) - 原子组结束。
  • (?!]]) - 如果在匹配文本之后有两个连续的 ]],则匹配失败的否定前瞻。

如果您只需要匹配 [[ 之后的任何非空白和非 ] 字符,您可以使用 并使用

\[\[(?>([^]\s]+))(?!]])

this regex demo

其解释非常相似,只是 [^]\s]+ 匹配除 ] 和空格之外的 1 个或多个字符。

C#代码:

var results = Regex.Matches(input, @"\[\[(?>(\p{Lu}\p{L}*(?:\.\p{Lu}\p{L}*)*))(?!]])")
       .Cast<Match>()
       .Select(m => m.Groups[1].Value)
       .ToList();

你也可以试试这个,我在 Wiktor 的语法上有一些错误。可能特定于某个版本的正则表达式。这个似乎对大多数正则表达式版本都很灵活。

(\[\[\s*[a-zA-Z]+\.[a-zA-Z]+\b)(?!]])

Regex Example

在正则表达式中,"not" 通常是你的敌人,所以对于这种情况,我建议直接使用:

\[\[[a-zA-Z.]+\]?([^a-zA-Z.\]]|$)

它会漏掉一些像“[[Foo.Bar]Baz”这样的情况,但它的可读性很好并且会捕捉到很多情况。