Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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
.net 编写正则表达式以捕获外括号之间的文本_.net_Regex_Balancing Groups - Fatal编程技术网

.net 编写正则表达式以捕获外括号之间的文本

.net 编写正则表达式以捕获外括号之间的文本,.net,regex,balancing-groups,.net,Regex,Balancing Groups,因此,我尝试解析一个包含以下格式文本的文件: outerkey = (innerkey = innervalue) 它变得更复杂了。这在文件中也是合法的: outerkey = (innerkey = (twodeepkey = twodeepvalue)(twodeepkey2 = twodeepvalue2)) 所以我想基本上只捕获outerkey的文本。我不能保证所有的文本都在一行。该值可能位于多行上。文件中有不止一项 这是到目前为止我的正则表达式: [^\s=]+\s*=\s*(\(

因此,我尝试解析一个包含以下格式文本的文件:

outerkey = (innerkey = innervalue)
它变得更复杂了。这在文件中也是合法的:

outerkey = (innerkey = (twodeepkey = twodeepvalue)(twodeepkey2 = twodeepvalue2))
所以我想基本上只捕获outerkey的文本。我不能保证所有的文本都在一行。该值可能位于多行上。文件中有不止一项

这是到目前为止我的正则表达式:

[^\s=]+\s*=\s*(\(\s*.*\s*\))
我的目标是简单地用我想要搜索的键替换第一部分[^\s=]+,然后得到外括号的整个文本

问题出在这里。我的正则表达式不仅会捕获我想要捕获的文本,而且还会捕获下一组的文本,因为正则表达式是贪婪的。使其不贪婪也不起作用,因为它将在第一个右括号处停止捕获

最终,如果我有以下字符串

foo = 
(
  ifoo = ifoov
)

bar =
(
  ibar =
    (iibar = iibarv)
    (iibar2 = iibarv2)
)
我想让这两组人匹配

(
  ifoo = ifoov
)

现在它将匹配

(
  ifoo = ifoov
)

bar =
(
  ibar =
    (iibar = iibarv)
    (iibar2 = iibarv2)
)
顺便说一句,我在多行和单行模式下运行它

有什么想法吗?谢谢

我能够对.NET正则表达式功能进行如下调整以解决此问题:

Regex r = new Regex(@"(?x) # for sanity!

    (?'Key' [^=\s]* )
    \s*=\s*
    (?'Value'
      (
         (
           [^()]*
           (?'Open'\()
         )+
         (
           [^()]*
           (?'Close-Open'\))
         )+
      )+?
    )
    (?(Open)(?!))

");
var text = @"
foo = 
(
  ifoo = ifoov
)

bar =
(
  ibar =
    (iibar = iibarv)
    (iibar2 = iibarv2)
)

outerkey = (innerkey = (twodeepkey = twodeepvalue)(twodeepkey2 = twodeepvalue2))
";

foreach (Match m in r.Matches(text)) {
  Console.WriteLine("Key: [{0}]", m.Groups["Key"]);
  Console.WriteLine("Value: [{0}]", m.Groups["Value"]);
  Console.WriteLine("-------");
}
Console.WriteLine("That's all folks!");
然后,我们可以按如下方式对其进行测试:

Regex r = new Regex(@"(?x) # for sanity!

    (?'Key' [^=\s]* )
    \s*=\s*
    (?'Value'
      (
         (
           [^()]*
           (?'Open'\()
         )+
         (
           [^()]*
           (?'Close-Open'\))
         )+
      )+?
    )
    (?(Open)(?!))

");
var text = @"
foo = 
(
  ifoo = ifoov
)

bar =
(
  ibar =
    (iibar = iibarv)
    (iibar2 = iibarv2)
)

outerkey = (innerkey = (twodeepkey = twodeepvalue)(twodeepkey2 = twodeepvalue2))
";

foreach (Match m in r.Matches(text)) {
  Console.WriteLine("Key: [{0}]", m.Groups["Key"]);
  Console.WriteLine("Value: [{0}]", m.Groups["Value"]);
  Console.WriteLine("-------");
}
Console.WriteLine("That's all folks!");
这张照片是:

文档中示例模式的一些小修改包括:

打开-关闭-两个括号现在都是\-\-[^]而不是-[^] 平衡结构以+重复?至少一个,但尽可能少,而不是* 内容在括号前匹配,而不是括号后匹配
一般来说,regexp无法计算匹配项,因此这不容易实现。NET有一个叫做“平衡组定义”的功能,应该可以让你达到这个目的。

我不担心第一部分。我知道我在尝试匹配所有不是空格或等号的东西。关于平衡括号的注释+1。人们经常忽略正则表达式。我的正则表达式之所以出错,是因为堆栈溢出的XSS过滤器。@Jason:好吧,我在互联网上遇到了问题,但我想我得到了你想要的模式。看看,加油!这正是我需要的。我的最后一个正则表达式如下:^test\s*=\s*?[^]*+?[^]*+*?OpenP?!$测试是我搜索的关键。我所需要做的就是查看值组,我得到了我想要的。sigh Stack overflow的XSS过滤器再次罢工!我的评论中应该有一些转义括号。谢谢对polygene的编辑。我想我对这个网站还是很陌生,所以我还是在想办法。