C# 发现两个开放括号缺少两个闭合括号
我想有一个正则表达式,它将匹配任何以两个开括号开头但没有两个匹配的结束括号的单词。例如:C# 发现两个开放括号缺少两个闭合括号,c#,regex,regex-lookarounds,C#,Regex,Regex Lookarounds,我想有一个正则表达式,它将匹配任何以两个开括号开头但没有两个匹配的结束括号的单词。例如: Good afternoon Mr. [[Insured.InsuredName]] - Your policy [[Insured.CurrentPolicy is out of date. 在这种情况下,将捕获“Insured.CurrentPolicy”。我不太会向前看/向后看。非常感谢您的帮助。您可以尝试使用 \[\[(?>(\p{Lu}\p{L}*(?:\.\p{Lu}\p{L}*)*)
Good afternoon Mr. [[Insured.InsuredName]] - Your policy
[[Insured.CurrentPolicy is out of date.
在这种情况下,将捕获“Insured.CurrentPolicy”。我不太会向前看/向后看。非常感谢您的帮助。您可以尝试使用
\[\[(?>(\p{Lu}\p{L}*(?:\.\p{Lu}\p{L}*)*))(?!]])
见
说明:
-两个\[\[
符号[
-启动一个原子组,该原子组将阻止回溯到其子模式中,这样,如果在匹配失败后进行前瞻,则整个正则表达式将无法返回匹配(?>
-第1组捕获(\p{Lu}\p{L}*(?:\。\p{Lu}\p{L}*)*)
-大写字母后跟0+任何字母(注意:将\p{Lu}\p{L}*
替换为\p{L}*
,以匹配字母数字和下划线字符)\w*
-零个或多个点序列,后跟大写字母,后跟0+任何字母(以上注释适用)(?:\。\p{Lu}\p{L}*)*
-原子组的末尾)
-如果在匹配的文本之后有两个连续的(?!]]
,则将导致匹配失败的负前瞻]]
[[
之后的任何非空白和非-]
字符,您可以使用
看
它的解释非常相似,只是[^]\s]+
匹配除]
和空格之外的一个或多个字符
C#代码:
var results=Regex.Matches(输入,@“\[\[(?>(\p{Lu}\p{L}*(?:\。\p{Lu}\p{L}*)*)(?!]))
.Cast()
.Select(m=>m.Groups[1]。值)
.ToList();
您可以尝试使用
\[\[(?>(\p{Lu}\p{L}*(?:\.\p{Lu}\p{L}*)*))(?!]])
见
说明:
-两个\[\[
符号[
-启动一个原子组,该原子组将阻止回溯到其子模式中,这样,如果在匹配失败后进行前瞻,则整个正则表达式将无法返回匹配(?>
-第1组捕获(\p{Lu}\p{L}*(?:\。\p{Lu}\p{L}*)*)
-大写字母后跟0+任何字母(注意:将\p{Lu}\p{L}*
替换为\p{L}*
,以匹配字母数字和下划线字符)\w*
-零个或多个点序列,后跟大写字母,后跟0+任何字母(以上注释适用)(?:\。\p{Lu}\p{L}*)*
-原子组的末尾)
-如果在匹配的文本之后有两个连续的(?!]]
,则将导致匹配失败的负前瞻]]
[[
之后的任何非空白和非-]
字符,您可以使用
看
它的解释非常相似,只是[^]\s]+
匹配除]
和空格之外的一个或多个字符
C#代码:
var results=Regex.Matches(输入,@“\[\[(?>(\p{Lu}\p{L}*(?:\。\p{Lu}\p{L}*)*)(?!]))
.Cast()
.Select(m=>m.Groups[1]。值)
.ToList();
您也可以试试这个,我在Wiktor的语法上遇到了一些错误。可能特定于某个版本的正则表达式。对于大多数正则表达式版本来说,这个似乎是灵活的
(\[\[\s*[a-zA-Z]+\.[a-zA-Z]+\b)(?!]])
您也可以试试这个,我在Wiktor的语法上遇到了一些错误。可能特定于某个版本的正则表达式。对于大多数正则表达式版本来说,这个似乎是灵活的
(\[\[\s*[a-zA-Z]+\.[a-zA-Z]+\b)(?!]])
在正则表达式中,“not”通常是您的敌人,因此对于这种情况,我建议您选择:
\[\[[a-zA-Z.]+\]?([^a-zA-Z.\]]|$)
它会漏掉一些像“[[Foo.Bar]Baz”这样的例子,但它可读性很强,而且会抓住很多例子。在正则表达式中,“not”通常是你的敌人,因此对于这种情况,我建议你选择:
\[\[[a-zA-Z.]+\]?([^a-zA-Z.\]]|$)
它会漏掉一些像“[[Foo.Bar]Baz”这样的案例,但是它可读性很强,可以抓住很多案例。您不需要在这里四处查看。只需使用
\[\[([^]]*)]]
并获取第1组的值。匹配是否仅由开头括号后的单词组成?好吧,这是一个很好的谜题。如果你能解释一下你要匹配的字符串可能由什么组成,这会有所帮助。我建议使用字母匹配模式,但正如我所指出的,\w
可以代替\[\[([^]*)]]]
并获取组1值。匹配是否只包含开头括号后的单词?嗯,这真是一个很好的谜题。如果你能弄清楚这些你试图匹配的字符串可能由什么组成,这会有所帮助。我建议使用字母匹配模式,但正如我所指出的,可以使用\w
而不是\p{L}
字母匹配模式,以防它们也包含数字和下划线。我认为您误解了问题。它正在寻找没有匹配的结束括号的开始括号。@4castle:我已经修改了答案以解决实际问题。输出中仍然包含一个假阳性。您可能需要一个原子组来防止回溯。那么,第一个原子组不应该匹配吗?这个问题听起来很模糊,但是是的,一个原子团在这里很方便。我更新了答案以反映这一要求。现在看起来不错:)以供参考,非常相似。(我对C#regex的味道不太熟悉,因此我没有给出自己的答案)。我想你误解了这个问题。它正在寻找没有匹配的结束括号的开始括号。@4castle:我已经修改了答案以解决实际问题。输出中仍然包含一个假阳性。你可能需要一个原子群来阻止它回来