Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 发现两个开放括号缺少两个闭合括号_C#_Regex_Regex Lookarounds - Fatal编程技术网

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}*)*))(?!]])

说明

  • \[\[
    -两个
    [
    符号
  • (?>
    -启动一个原子组,该原子组将阻止回溯到其子模式中,这样,如果在匹配失败后进行前瞻,则整个正则表达式将无法返回匹配
  • (\p{Lu}\p{L}*(?:\。\p{Lu}\p{L}*)*)
    -第1组捕获
    • \p{Lu}\p{L}*
      -大写字母后跟0+任何字母(注意:将
      \p{L}*
      替换为
      \w*
      ,以匹配字母数字和下划线字符)
    • (?:\。\p{Lu}\p{L}*)*
      -零个或多个点序列,后跟大写字母,后跟0+任何字母(以上注释适用)
  • -原子组的末尾
  • (?!]]
    -如果在匹配的文本之后有两个连续的
    ]]
    ,则将导致匹配失败的负前瞻
如果您只需要匹配
[[
之后的任何非空白和非-
]
字符,您可以使用

它的解释非常相似,只是
[^]\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}*)*))(?!]])

说明

  • \[\[
    -两个
    [
    符号
  • (?>
    -启动一个原子组,该原子组将阻止回溯到其子模式中,这样,如果在匹配失败后进行前瞻,则整个正则表达式将无法返回匹配
  • (\p{Lu}\p{L}*(?:\。\p{Lu}\p{L}*)*)
    -第1组捕获
    • \p{Lu}\p{L}*
      -大写字母后跟0+任何字母(注意:将
      \p{L}*
      替换为
      \w*
      ,以匹配字母数字和下划线字符)
    • (?:\。\p{Lu}\p{L}*)*
      -零个或多个点序列,后跟大写字母,后跟0+任何字母(以上注释适用)
  • -原子组的末尾
  • (?!]]
    -如果在匹配的文本之后有两个连续的
    ]]
    ,则将导致匹配失败的负前瞻
如果您只需要匹配
[[
之后的任何非空白和非-
]
字符,您可以使用

它的解释非常相似,只是
[^]\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
可以代替de>\p{L}字母匹配模式,以防它们也可能包含数字和下划线。您不需要在这里四处查看。只需使用
\[\[([^]*)]]]
并获取组1值。匹配是否只包含开头括号后的单词?嗯,这真是一个很好的谜题。如果你能弄清楚这些你试图匹配的字符串可能由什么组成,这会有所帮助。我建议使用字母匹配模式,但正如我所指出的,可以使用
\w
而不是
\p{L}
字母匹配模式,以防它们也包含数字和下划线。我认为您误解了问题。它正在寻找没有匹配的结束括号的开始括号。@4castle:我已经修改了答案以解决实际问题。输出中仍然包含一个假阳性。您可能需要一个原子组来防止回溯。那么,第一个原子组不应该匹配吗?这个问题听起来很模糊,但是是的,一个原子团在这里很方便。我更新了答案以反映这一要求。现在看起来不错:)以供参考,非常相似。(我对C#regex的味道不太熟悉,因此我没有给出自己的答案)。我想你误解了这个问题。它正在寻找没有匹配的结束括号的开始括号。@4castle:我已经修改了答案以解决实际问题。输出中仍然包含一个假阳性。你可能需要一个原子群来阻止它回来