问题标签 [regex-recursion]

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.

0 投票
1 回答
55 浏览

regex - 递归正则表达式的意外行为

我正在尝试匹配可以包含平衡<>字符的 C++ 参数类型。

使用这个正则表达式: (\<(?>[^<>]|(?R))*\>)

在这个字符串上:QMap<QgsFeatureId, QPair<QMap<Something, Complex> >>

它匹配除前 4 个字符(QMap)之外的所有字符。

现在,如果我\w+在正则表达式的开头添加,它现在只匹配它的结尾 ( QPair<QMap<Something, Complex> >>) 而不是整个字符串。

有什么解释以及如何解决这个问题?

你可以在这里在线尝试。

这是打算在 Perl 5.10+ (5.24) 中使用的。

0 投票
2 回答
157 浏览

regex - 这个递归正则表达式究竟是如何工作的?

这是对这个问题的跟进。

看看这个模式:

它匹配任何o长度为 2 n且 n ≥ 1的序列。
它可以工作,请参阅 regex101.com(添加单词边界以便更好地演示)。
问题是:为什么?

在下文中,字符串的描述(匹配与否)将只是一个粗体数字或描述长度的粗体术语,如2 n

分解(添加空格):

我不明白为什么这不匹配2n,而是2 n,因为我会将模式描述为 *an undefined number of o o,相互堆叠。

可视化:

没有递归,2是匹配的:

一次递归,4是匹配:

到目前为止,很容易。

两次递归。显然是错误的,因为模式与6不匹配:

但为什么?它似乎符合模式。

我得出的结论是,这不仅仅是重复的普通模式,否则6将不得不匹配。

但根据regular-expressions.info

(?P<name>[abc])(?1)(?P>name)像 dos 一样匹配三个字母(?P<name>[abc])[abc][abc]

[abc])(?1){3}[...] 相当于([abc])[abc]{3}

所以它似乎只是简单地重新匹配正则表达式代码,而没有关于捕获组的先前匹配的信息。

有人可以解释并想象为什么这个模式匹配2 n而没有别的吗?

编辑:

评论中提到过:

我怀疑在自身内部引用捕获组实际上是受支持的情况。

regular-expressions.info 确实提到了该技​​术:

如果您在它调用的组内发出呼叫,您将拥有一个递归捕获组。

0 投票
2 回答
207 浏览

regex - 为什么这个递归正则表达式不捕获整个代码块?

我正在尝试编写一个递归正则表达式来捕获代码块,但由于某种原因,它似乎没有正确捕获它们。我希望下面的代码能够捕获函数的完整主体,但它只捕获第一个if语句的内容。

这几乎就像以.+?某种方式吞噬了第一个{,但它应该是非贪婪的,所以我不明白为什么会这样。

是什么导致它以这种方式行事?

脚本:

输出:

预期输出:

我知道有一个Text::Balanced用于此目的的模块,但我正在尝试手动执行此操作以了解有关正则表达式的更多信息。

0 投票
3 回答
519 浏览

regex - 使用 Perl 正则表达式在 C 样式代码块之前和之后捕获文本

我正在尝试使用 Perl 正则表达式在 C 样式代码块之前和之后捕获一些文本。到目前为止,这就是我所拥有的:

我遇到了第二个捕获组在比赛后没有被初始化的问题。有没有办法在一个DEFINE块之后继续一个正则表达式?我认为这应该可以正常工作。

$2应该包含代码块下方的注释,但它没有,我找不到一个很好的理由为什么这不起作用。

0 投票
3 回答
286 浏览

python - 正则表达式捕获重复模式

我一直在互联网上奔波,试图找出如何构建正则表达式来以我需要的方式捕获文本;所以我看到了一些 StackOverflow 问题,但没有一个能表达我想要的,但如果你已经在这里看到了与我的问题类似的东西,请随时指向那篇文章......

我尝试使用递归,但似乎我还不够好,无法让某些东西工作

一些注意事项:

1)我不能使用解析程序,因为将使用此数据的程序将使用正则表达式来捕获它,而这个程序是一个“通用”程序,实际上它正在捕获任何需要的数据,只有我需要做的是给出适当的正则表达式来获取它需要的信息,我还需要尽可能地保持它的一致性,所以我不能使用第三方或外部程序。

2) 'key': 'value' 对可能会有所不同,它们的对数并不总是相同的......这就是我认为的困难所在。

3)将使用此正则表达式的程序是在 Python 2.7.3 中创建的:该程序的工作原理:它使用 Json 配置文件,我可以在其中设置要运行的命令,该命令将为我提供所需的数据,然后我指定一个正则表达式来教程序需要捕获什么以及如何处理它,即:如何处理被捕获的组......所以这就是我不能使用解析器的原因。该程序使用结构将配置的收集器(使用正则表达式)运行到远程主机并收集所有数据......

4)程序用于收集数据以将它们发布到网络服务器并获取指标和其他东西,如图形和监控警报等

我已经能够捕获我计划捕获的几乎所有数据,但是当我试图为此创建一个收集器时,我被卡住了..

以下数据重复如下,但服务器名称不同,当然值也会改变:

我想如何捕捉它:

如果显示了唯一的服务器,那么使用下面的正则表达式我能够捕获所有(服务器名称除外)并不难:

这个正则表达式将只给出第二部分,即变量和值的列表,而不是服务器名称......所以如果我在相同的输出上获得几个具有相同数据的服务器,那么将无法知道来自哪个服务器价值观来自...

如果我尝试添加对服务器名称的支持:我尝试了以下正则表达式,它可以工作,但只能捕获服务器名称和第一对参数:

我尝试了多种递归功能,但未能实现我想要的。

谁能在这里指出我正确的方向...?

谢谢。

0 投票
1 回答
50 浏览

php - 反向引用 PHP / PCRE 中的其他递归级别

我试图在网上找到答案,但我无法。此页面上的第三部分是否适用于 PHP / PCRE?

https://www.regular-expressions.info/recursebackref.html

“对其他递归级别部分的反向引用”。我只对 PHP 感兴趣,所以如果这不适用于 PHP 语言(或者可能是 JavaScript),这就是我需要知道的全部内容。

谢谢。

0 投票
0 回答
13 浏览

emoji - 如何使用 RegExr 在字符串中的特定短语之后提取所有 18 个字符条目的列表?

我设法在我的表情符号列表中提取方括号内的文本列表:

https://regexr.com/3sqk1

但是现在我需要为每个表情符号提取等效的 decimalSurrogateHtml 对(我知道其中一些有 2 对,但只需提取以下文本右侧的第一对就可以了)

我希望仅提取“decimalSurrogateHtml”右侧的 18 个字符:

有谁知道我应该输入的表达式来检索这些列表?

谢谢

0 投票
1 回答
815 浏览

regex - 正则表达式递归:第 N 个子模式

我正在尝试学习正则表达式中的递归,并对 PCRE 风格中的概念有一个基本的了解。我想打破一个字符串:

进入:

我知道两个正则表达式都不能做到这一点,但我对第一个模式有效而第二个模式不起作用的原因更加好奇。

此外,例如,如果您正在处理一个长字符串,并且一个模式重复自身,是否可以不断扩展完整匹配,并逐渐增加组,而无需编写与正则表达式分开的循环语句。

这是我最接近的模式,但中间组:Dogs (Pack) 变为 Group 0。

0 投票
1 回答
31 浏览

php - 获取不在括号内的字符 REGEX

我基本上正在研究自定义查询构建。我将模式设计为​​ field_set 和 sub_field_sets。示例查询:

我想使用 REGEX 从 root 获取所有运算符。在这种情况下应该导致 ['+', '-'] 而不是['+', '+', '-']

0 投票
1 回答
1356 浏览

javascript - 不明白我的“不必要的转义字符”错误来自哪里

我有一个包含两个值的 url,一个关键字和一个位置名称。关键字位于“/r/”之后,位置位于“/l/”之后。
例如: localhost:3000/search/r/keyword/l/location

只获取'/r/'(关键字)之后的值和'/l/'(位置)之后的值;我正在做以下正则表达式:

这可以解决问题,但是,React 返回以下消息:

不必要的转义字符:/ no-useless-escape

是什么导致错误?