问题标签 [balancing-groups]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - 将 PCRE 递归正则表达式模式转换为 .NET 平衡组定义
PCRE 有一个叫做递归模式的特性,可以用来匹配嵌套的子组。例如,考虑“语法”
它可以在 PCRE 中使用模式完成
(示例测试用例: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 - Writing a regex to capture text between outer parenthesis
So I'm trying to a parse a file that has text in this format:
It gets more complex. This is also legal in the file:
So I want to basically capture only the outerkey's text. I cannot guarantee that all of the text will be on one line. It is possible that the value be on multiple lines. And there is more than one item in the file.
So here's my regex so far:
The goal is for me to simply replace the first part [^\s=]+
with the key I want to search on and I get the entire text of the outer parenthesis.
Here's the problem. My regex will not only capture the text I want to capture, but it will also capture the text from the next group since regex's are greedy. Making it not greedy would not work either since it will stop capturing at the first closing parenthesis.
Ultimately, if I have the following string
I want the groups to match
and
Right now it will match
By the way, I am running this in multiline and singleline mode.
Any ideas? Thanks!
c# - 在贪婪的重复中回溯平衡组可能会导致不平衡?
作为针对此问题的一般酿造示例,我的意图是匹配一些a
's,然后匹配相同数量的b
's,再加上一个 's b
。
检查此片段中展示的两种模式(也在 ideone.com 上):
请注意,两种模式的匹配存在差异。r1
,它在平衡组构造上使用贪婪重复,匹配 3a
和 3 b
,这不是预期的。r2
,它使用了不情愿的重复,给了我 2a
和 3 b
,这是预期的。
我可以解释这一点的唯一方法是,当(?<B-A> b)+
回溯匹配一个 lessb
时,它会从B
堆栈中弹出,但不会推回相应地从A
堆栈中弹出的内容。因此,即使b
现在由于回溯而匹配到少一个,A
堆栈仍然是空的。这是我可以解释如何r1
匹配的唯一方法aaabbb
。
请注意,使用不情愿+?
inr2
不会导致此问题。在我看来,这是因为与贪婪的重复不同,不情愿的重复不必“消除”对A
堆栈的损害,可以这么说。相比之下,贪婪的重复会造成尽可能多的“损害”,但回溯无法“让事情保持原样”到A
堆栈中。
这是对发生的事情的正确分析吗?如果是这样,这种行为是设计使然吗?因为在我看来基本上是在贪婪的重复中回溯平衡组可能会导致不平衡,因此这可能被归类为错误(或者至少是没有充分记录的有点令人惊讶的行为)。
regex - 正则练习:阶乘
这是 StackOverlow 的一个实验性新功能:通过解决各种经典问题来锻炼你的正则表达式肌肉。没有一个正确的答案,事实上我们应该收集尽可能多的正确答案,只要它们具有教育价值。接受所有口味,但请清楚记录。尽可能提供测试用例/片段来证明该模式“有效”。
我们如何使用正则表达式找到数字x是否是阶乘?
奖励:如果模式可以确定x = n!, 它也能找到n吗?
.net - 如何检索由“{{”和“}}”包围的子字符串的最长匹配项?
我正在尝试解析通过 Wikipedia 的 API 接收的 wikitext 文件,问题是它的一些模板(即包含在 {{ 和 }} 中的片段)不会自动扩展为 wikitext,因此我必须在文章中手动查找它们最终获取并替换它们。问题是,我可以在 .NET 中使用正则表达式从文本中获取匹配项吗?
为了让自己更清楚,这里有一个例子来说明我的意思:
对于字符串
应该有一个匹配,即整个字符串,所以最长可能匹配。
另一方面,对于本例中的“孤立”大括号:
结果应该是一个匹配:{{...}}
谁能给我一个建议?提前致谢。
c# - 使用平衡组的正则表达式
我有一个基本的文本模板引擎,它使用如下语法:
我用于解析它的正则表达式存在问题,它没有考虑嵌套的 IF/ENDIF 块。
我正在使用的当前正则表达式是:%IF (?<Name>[\w_]+)(?<Contents>.*?)%ENDIF
我一直在阅读平衡捕获组(.NET 正则表达式库的一项功能),因为我知道这是在 .NET 中支持“递归”正则表达式的推荐方式。
我一直在玩平衡组,到目前为止,我想出了以下几点:
但这并不完全符合我的预期。例如,它捕获了很多空组。帮助?
.net - 正则表达式匹配 VB.NET 选择大小写,没有其他大小写
我正在寻找一个 RegEx,它将找到其中没有 Case Else 的 Select Case 语句。
这是我到目前为止想出的
除了可能有嵌套语句的情况外,这个工作完美。
在我尝试使用平衡组时,我想出了以下内容
哪个正确找到了 Select Case/End Selects 的平衡组,但我很难让它与 (?
下面是一些示例数据:
在这种情况下,它应该只匹配内部 Select Case,因为 Outter 有它的 Case Else
应该匹配整个块,因为内部有 Else 但外部没有。
不应该匹配,因为内部和外部选择都有 Case Else
.net - 正则表达式匹配可转义的字符串?
我写了这个正则表达式来匹配字符串:
即,一些用引号括起来的文本。它还支持转义,因此它将"hello\"world"
完全匹配,而不会像我想要的那样在第一个引号处停止。但是我忘记了双重转义。"hello\\"world"
例如,无效。
我很确定这可以通过平衡组来解决,但我以前从未真正使用过它们。有谁知道这个怎么写?
.net - 可以在正则表达式的一个位置匹配但不能在另一个位置匹配(例如位置异或)?
我希望在一个更大的正则表达式中创建几个子表达式,其中每个子表达式匹配输入中一个位置或另一个位置的某些内容,但不是在两个位置,最好每个“感兴趣区域”使用相同的命名组。例如,我想匹配下面斜体的体积单位和粗体显示的货币单位。
- 3.23美元/加仑。
- 3.23美元(加仑)
- 4.50加元/加仑
- 1加仑@ 3.23美元
- 10加仑。@ 4.50加元
或更一般地说:
- 东西更多的东西XXX更多的东西
- 东西XXX更多东西
其中stuff和morestuff可能是一组复杂的子表达式。
似乎有可能使用一些组合
- 组堆栈推送/弹出
- 平衡组
- 看看周围
但我不确定如何进行。它是否归结为交替(|
)或具有不同表达的多次传递(我认为这相当于同一件事)?
c# - 正则表达式平衡组
我正在尝试匹配字符串中的平衡大括号 ({})。例如,我想平衡以下内容:
我从 MSDN 想出了这个正则表达式,但效果不佳。我想提取 {} 的多个嵌套匹配集。我只对父匹配感兴趣