问题标签 [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 - VBA:与 .NET 正则表达式平衡组不兼容?
我一直在检查是否可以在 Excel 电子表格 VBA 函数中使用 .NET 正则表达式平衡组。
但是,VBA 似乎与 .NET 不兼容,也不是 .NET 的一部分。例如,维基百科直言“VBA 与 Visual Basic .NET (VB.NET) 不兼容”。
所以,为了确定,w/r/t 正则表达式平衡组,我在 VBA 中运气不好,对吗?
.net - 可变长度后视中的平衡组
TL;DR:在 .NET 的lookbehinds 中使用捕获(特别是平衡组)会改变获得的捕获,尽管它不应该产生影响。.NET 的lookbehinds 是什么破坏了预期的行为?
我试图想出对另一个问题的答案,以此作为玩弄 .NET 平衡组的借口。但是,我无法让它们在可变长度的后视中工作。
首先,请注意,我不打算有效地使用这个特定的解决方案。这更多是出于学术原因,因为我觉得可变长度后视发生了一些我不知道的事情。并且知道将来当我实际上需要使用这样的东西来解决问题时,它可能会派上用场。
考虑这个输入:
目标是匹配所有字母,这些字母在括号内,前面有~
,不管有多深(所以从a
到i
)。我的尝试是在后视中检查正确的位置,以便我可以在一次调用中获取所有字母Matches
。这是我的模式:
在后视中,我尝试找到一个~(
,然后我使用命名的组堆栈Depth
来计算无关的左括号。只要在其中打开的括号~(
从未关闭,则向后查找应该匹配。如果到达了右括号,(?<-Depth>...)
则无法从堆栈中弹出任何内容,并且后向查找应该失败(即,对于来自 的所有字母j
)。不幸的是,这不起作用。相反,我匹配a
, b
, c
, e
, f
,g
和m
. 所以只有这些:
这似乎意味着一旦我关闭了一个括号,lookbehind 就无法匹配任何东西,除非我回到我之前去过的最高嵌套级别。
好的,这可能只是意味着我的正则表达式有些奇怪,或者我没有正确理解平衡组。但后来我尝试了这个,没有向后看。我为每个字母创建了一个字符串,如下所示:
并在其中的每一个上使用了这种模式:
并且根据需要,所有案例都匹配,其中替换和之后的所有案例z
之间的一个字母失败。a
i
那么(可变长度)lookbehind 做了什么打破了平衡组的这种使用?我整个晚上都试图研究这个(并找到了像这样的页面),但我在回顾中找不到这个的单一用途。
如果有人可以将我链接到有关 .NET 正则表达式引擎如何在内部处理 .NET 特定功能的一些深入信息,我也会很高兴。我发现了这篇很棒的文章,但它似乎并没有进入(可变长度)lookbehinds,例如。
c# - c# 正则表达式与平衡组没有响应
我有以下代码:
当template
平衡时,则返回匹配项,一切正常。但是当我在模板中更改{end iteration items}
为{end1 iteration items}
后iiiiiiiiiiiiiii
行时,代码停止在线响应matches.Dump()
(Dump()
是在 LinQPad 中读取/枚举的扩展方法)
怎么了?是否可以重写正则表达式以使其始终响应?
编辑
我的目标是如果语法有效则捕获所有顶级<template>
组,否则不捕获任何内容。我按照卢卡斯的建议尝试了非回溯组,但是当语法有效时,现在没有捕获。
.net - 将正则表达式与一个单词的可变长度look-behind和另一个单词的可变长度负look-behind匹配?
我有一个正则表达式,仅当字符串在 A 之前的某处包含模式B时才捕获模式A。
假设,为了简单起见,A是\b\d{3}\b
(即三个数字),B是单词“foo”。
因此我拥有的正则表达式是(?<=\b(?:foo)\b.*?)(?<A>\b\d{3}\b)
.
例如,对于字符串
它捕获
我有一个新要求,现在我必须排除模式C前面的捕获,假设C是单词“bar”。我想要构建的是一个表达的正则表达式
所以,在示例字符串中,我将不得不捕获
当然像(?<=\b(?:foo)\b.*?)(?<!\b(?:bar)\b.*?)(?<A>\b\d{3}\b)
将不起作用,因为它会在“bar”第一次出现后排除所有内容,并且捕获将是
正则表达式(?<=\b(?:foo)\b(?!.*?(?:\bbar\b)).*?)(?<A>\b\d{3}\b)
也不起作用,因为对于我的测试字符串中的第一个“foo”,它总是会找到“bar”作为后缀,它只会捕获
到目前为止,使用表达式的条件匹配并且(现在)知道在后视中,.net 从右到左匹配和捕获,我能够创建以下正则表达式(?<=(?(C)(?!)| (?:\bfoo\b))(?:(?<!\bbar)\s|(?<C>\bbar\s)|[^\s])*)(?<A>\b\d{3}\b)
这可行,但太复杂了,因为模式A、B和C比我在此处发布的示例复杂得多。
是否可以简化此正则表达式?也许使用平衡组?
c# - 带有平衡组的正则表达式
我需要编写正则表达式,以特殊符号捕获类型名称的通用参数(也可以是通用的),如下所示:
让我们假设类型名称是[\w.]+
,参数是[\w.,\[\]]+
,所以我只需要抓取Int32
,Dictionary[Int32,Int32]
并且Int32
基本上,如果平衡组堆栈为空,我需要采取一些措施,但我真的不明白如何。
UPD
下面的答案帮助我快速解决了问题(但没有适当的验证并且深度限制 = 1),但我已经设法通过组平衡来做到这一点:
UPD2(最后一次优化)
c# - 为什么在 Regex 中使用平衡组的尝试失败了?
对于 string "1-2-3-4"
,我想创建一个正则表达式,它会给我以下匹配项,即每个匹配的数字对由 1 个或多个破折号分隔:
"1-2"
"2-3"
"3-4"
每个数字都在自己的捕获组中。
第一次尝试(c# 风格):
这给了我:
"1-2"
"3-4"
显然,在获得第一个匹配项时,我已经消耗了数字"2"
,因此要匹配的下一个字符是 dash after "2"
。
然后我最终阅读了我的 c#-/Regex-skills 并偶然发现了平衡组,进入我的固执。据我了解,这应该这样做(但事实并非如此):
这产生与我第一次尝试相同的结果。我希望这<first-entire>
件事会将捕获倒回到上一个匹配项(如果有的话),使该\k<entire>
部分现在匹配整个上一个匹配项(在 1 次迭代之后将是"1-2"
),或者 - 如果第一次迭代 - 回退到<first>\d
模式。
我误解了什么?
更新:可能应该准确解释我的目标 - 但评论者暗示,找到了我的目标的解决方案,即删除可能出现在数字之间的所有破折号(1个或更多)。解决了一个更简单的积极前瞻,如:
将保持原样,因为它已作为副本关闭。显然我对使用平衡组是错误的:)
c# - 使用正则表达式平衡组来匹配嵌套标签
我正在尝试使用正则表达式平衡组来匹配嵌套标签,如下所示:
我的表达:
我的问题:
c# - Regex and balancing groups
I'm stuck on a Regular expression:
I have a input string with numbers and one letter that can contain more numbers and letters within the string and between parenthesis:
Just a few examples
I have read that this can be obtained using balancing groups, however I have tried lot of regular expressions and the closes is the following:
I have also thought that maybe I'm making it harder and I should just run several times the same regex, first time for everything outside the parenthesis and the second time for the inner stuff and run it again when matches the inner. Something like that:
Suggestions or help?
Thanks in advance.
Edit 1: I don't have to validate the input, just parse it.
Edit 2: So, the reason behind is to identify a condition by the condition Id and then apply the operator against the other conditions in the input String. In the same order as appear in the input String, a more general example to make it easier to understand would be logic gates:
For a given input of 20x10x15 I will have to identify the conditions by the conditionId and check if the condition is valid and apply the XOR operator on them, something like:
That is the reason I cannot group everything into a "ConditionId" group and "Operator" group.
Edit 3 This is also a valid example