找到两个打开的括号,缺少两个右括号

时间:2016-06-08 20:27:45

标签: c# regex regex-lookarounds

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

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

在这种情况下,“Insured.CurrentPolicy”将被捕获。我是前瞻/后视的新手。感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

您可以尝试使用

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

请参阅regex demo

<强>解释

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

如果您只需要在] 之后匹配任何非空格和非[[字符,您可以使用4castle's approach并使用

\[\[(?>([^]\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();

答案 1 :(得分:1)

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

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

Regex Example

答案 2 :(得分:1)

在正则表达式中,&#34;不是&#34;通常是你的敌人,所以对于这种情况,我建议你去寻找:

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

它会错过像[&Foo.Bar] Baz&#34;但它具有相当的可读性,可以捕获很多案例。