标签: balancing-groups

什么是正则表达式平衡组?

我刚刚阅读了一个关于如何在双花括号中获取数据的问题(这个问题),然后有人提出了平衡组.我还不太确定它们是什么以及如何使用它们.

我读了平衡组定义,但解释很难理解,我仍然对我提到的问题感到困惑.

有人可以简单地解释什么是平衡组以及它们如何有用吗?

.net c# regex balancing-groups

88
推荐指数
2
解决办法
1万
查看次数

将PCRE递归正则表达式模式转换为.NET平衡组定义

PCRE具有称为递归模式的功能,可用于匹配嵌套的子组.例如,考虑"语法"

Q -> \w | '[' A ';' Q* ','? Q* ']' | '<' A '>'
A -> (Q | ',')*
// to match ^A$.
Run Code Online (Sandbox Code Playgroud)

它可以在具有模式的PCRE中完成

^((?:,|(\w|\[(?1);(?2)*,?(?2)*\]|<(?1)>))*)$
Run Code Online (Sandbox Code Playgroud)

(示例测试用例:http://www.ideone.com/L4lHE)

应该匹配:

abcdefg abc,def,ghi abc,,,def ,,,,,, [abc;] [a,bc;] sss[abc;d] as[abc;d,e] [abc;d,e][fgh;j,k] <abc> [<a>b;<c,d>,<e,f>] <a,b,c> <a,bb,c> <,,,> <> <><> <>,<> a<<<<>>><a>> <<<<<>>>><><<<>>>> <z>[a;b] <z[a;b]> [[;];] [,;,] [;[;]] [<[;]>;<[;][;,<[;,]>]>]

不应该匹配:

<a bc> <abc<de> [a<b;c>;d,e] [a] <<<<<>>>><><<<>>>>> <<<<<>>>><><<<>>> [abc;def;] [[;],] [;,,] [abc;d,e,f] [<[;]>;<[;][;,<[;,]>]]> <z[a;b>]

.NET中没有递归模式.相反,它为基于堆栈的操作提供了平衡组,以匹配简单的嵌套模式.

是否可以将上述PCRE模式转换为.NET Regex风格?

(是的,我知道最好不要使用正则表达式.这只是一个理论问题.)

参考

.net regex pcre recursive-regex balancing-groups

21
推荐指数
2
解决办法
1658
查看次数

在可变长度的后视中平衡组

TL; DR:在.NET的lookbehinds中使用捕获(特别是平衡组)会改变获得的捕获,尽管它不应该有所作为.什么是.NET的外观打破了预期的行为?

我试图找到另一个问题的答案,作为借助.NET平衡组的借口.但是,我不能让他们在可变长度的lookbehind内工作.

首先,请注意我并不打算高效地使用这个特定的解决方案.这更多是出于学术原因,因为我觉得可变长度的lookbehind有一些我不知道的事情.并且知道这可能在将来派上用场,当我真的需要使用这样的东西来解决问题时.

考虑这个输入:

~(a b (c) d (e f (g) h) i) j (k (l (m) n) p) q
Run Code Online (Sandbox Code Playgroud)

我们的目标是匹配所有的字母,这是由前括号内~,没有多么深跌(所以一切从ai).我的尝试是检查后视镜中的正确位置,以便我可以通过一次调用获得所有字母Matches.这是我的模式:

(?<=~[(](?:[^()]*|(?<Depth>[(])|(?<-Depth>[)]))*)[a-z]
Run Code Online (Sandbox Code Playgroud)

在lookbehind我尝试找到一个~(,然后我使用命名组堆栈Depth来计算无关的开括号.只要打开的括号~(永远不会关闭,那么lookbehind应该匹配.如果到达(?<-Depth>...)那个右括号,则无法从堆栈中弹出任何内容,并且lookbehind应该失败(即,对于所有来自的字母j).不幸的是,这不起作用.相反,我匹配a,b,c,e,f,gm.所以只有这些:

~(a b (c) _ (e f (g) _) _) _ (_ (_ (m) _) _) _
Run Code Online (Sandbox Code Playgroud)

这似乎意味着,一旦我关闭了一个单一的括号,看起来就无法匹配任何东西,除非我回到我以前最高的嵌套水平.

好吧,这可能只是意味着我的正则表达式有些奇怪,或者我没有正确理解平衡组.但后来我尝试了这个没有外观.我为每个字母创建了一个字符串,如下所示:

~(z …
Run Code Online (Sandbox Code Playgroud)

.net regex lookaround balancing-groups

14
推荐指数
1
解决办法
799
查看次数

如何进行平衡组捕获?

假设我有这个文本输入.

 tes{}tR{R{abc}aD{mnoR{xyz}}}
Run Code Online (Sandbox Code Playgroud)

我想提取ff输出:

 R{abc}
 R{xyz}
 D{mnoR{xyz}}
 R{R{abc}aD{mnoR{xyz}}}
Run Code Online (Sandbox Code Playgroud)

目前,我只能使用msdn中的平衡组方法提取{}组内的内容.这是模式:

 ^[^{}]*(((?'Open'{)[^{}]*)+((?'Target-Open'})[^{}]*)+)*(?(Open)(?!))$
Run Code Online (Sandbox Code Playgroud)

有谁知道如何在输出中包含R {}和D {}?

c# regex balancing-groups expresso

5
推荐指数
1
解决办法
197
查看次数

VBA:与.NET正则表达式平衡组不兼容?

我一直在检查是否可以在Excel电子表格VBA函数中使用.NET正则表达式平衡组.

但是,似乎VBA与.NET不兼容,也不是它的一部分.例如,维基百科直言不讳地说"VBA与Visual Basic .NET(VB.NET)不兼容".

所以,只是为了确定,w/r/t正则表达式平衡组,我在VBA中运气不好,对吗?

.net regex vba porting balancing-groups

3
推荐指数
2
解决办法
187
查看次数

使用平衡组的正则表达式

我有一个基本的文本模板引擎,使用这样的语法:

foo bar
%IF MY_VAR
  some text
  %IF OTHER_VAR
    some other text
  %ENDIF
%ENDIF
bar foo
Run Code Online (Sandbox Code Playgroud)

我有一个正则表达式的问题,我用来解析它,因为它没有考虑嵌套的IF/ENDIF块.

我正在使用的当前正则表达式是: %IF (?<Name>[\w_]+)(?<Contents>.*?)%ENDIF

我一直在阅读平衡捕获组(.NET的正则表达式库的一个特性),因为我理解这是支持.NET中"递归"正则表达式的推荐方法.

我一直在玩平衡组,到目前为止已经提出了以下建议:

(
 (
  (?'Open'%IF\s(?<Name>[\w_]+))
  (?<Contents>.*?)
 )+
 (
  (?'Close-Open'%ENDIF)(?<Remainder>.*?)
 )+
)*
(?(Open)(?!))
Run Code Online (Sandbox Code Playgroud)

但这并不完全符合我的预期.例如,它捕获了很多空组.救命?

.net c# regex balancing-groups

1
推荐指数
1
解决办法
1175
查看次数

正则表达式平衡组

我试图在字符串中匹配平衡大括号({}).例如,我想平衡以下内容:

if (a == 2)
{
  doSomething();
  { 
     int x = 10;
  }
}

// this is a comment

while (a <= b){
  print(a++);
} 
Run Code Online (Sandbox Code Playgroud)

我从MSDN中得到了这个正则表达式,但是效果不好.我想提取多个{}的嵌套匹配集.我只对父母比赛感兴趣

   "[^{}]*" +
   "(" + 
   "((?'Open'{)[^{}]*)+" +
   "((?'Close-Open'})[^{}]*)+" +
   ")*" +
   "(?(Open)(?!))";
Run Code Online (Sandbox Code Playgroud)

c# regex balancing-groups

1
推荐指数
1
解决办法
1653
查看次数