问题标签 [recursive-regex]
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.
python - 在 Python 中使用正则表达式匹配嵌套结构
我似乎记得 DotNet 中的正则表达式有一种特殊的机制,可以正确匹配嵌套结构,例如“ ( (a ( ( c ) b ) ) ( d ) e )
”中的分组。
此功能的 python 等效项是什么?这可以通过一些解决方法使用正则表达式来实现吗?(虽然这似乎是当前的正则表达式实现不是为这种问题而设计的)
.net - 正则表达式、反向引用或替代构造
我正在尝试在 .NET 中编写一个正则表达式,以从看起来像这样的函数列表中捕获整个函数。
所以我得到了
这将捕获除最后一个函数之外的所有函数......或者这个
这将正确匹配除第一个函数之外的所有函数。第一个函数仅部分匹配。
任何的想法?如果可能,请提供一些解释。
java - 具有递归支持的 Java 正则表达式库
我正在寻找一个支持递归的 Java 正则表达式库,例如:
JDK 不支持,ORO 也不支持。
有人知道吗?
谢谢, 翁德拉
编辑:见http://www.php.net/manual/en/regexp.reference.recursive.php
我需要它来表达这个:
(?:mUi)^/--++ *+(.*)(?: *(?<= |^)\\.((?:\\([^)\\n]+\\)|\\[[^\\]\\n]+\\]|\\{[^}\\n]+\\}|<>|>|=|<){1,4}?))?$((?:\\n.*+)*)(?:\\n(?0)|\\n\\\\--.*$|\\z)
.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 样式?
(是的,我知道最好不要为此使用正则表达式。这只是一个理论问题。)
参考
php - 由于 PCRE 限制,正则表达式使 Apache 崩溃
我目前正在创建 bbcode 解析引擎,但遇到了我自己无法解决的情况。
问题是,我遇到了一个与此完全相同的问题: Windows 上的 Apache / PHP crash with regular expression
这意味着,如果我做出类似下面示例的操作,Apache 会因为递归计数达到 690(PCRE 的内存限制为 1MB)而崩溃:
所以我需要以某种方式最小化*
我+
的正则表达式的需求,但这就是我没有想法的地方,所以我想也许你可以提出一些建议。
欢迎使用其他解析 bbcode 的方法(可以处理嵌套标签)。但是我不想使用已经构建的类或其他东西。我喜欢自己做事!
我还研究了 PECL 和 Pear HTML_BBCodeParser。但我不希望我的应用程序依赖于扩展。更有可能我可能会做一些脚本来检查该扩展,如果它不存在,请使用我在这里尝试做的 BBCode 解析器。
对不起,如果我的描述令人沮丧,我不是英语专业人士^^
编辑。所以正则表达式解释说:
这是我的开始标签。我使用了命名组。使用“标签”标识标签,使用“属性”标识标签属性。也可以将标签视为一个属性。那么这里发生了什么?我尝试匹配一个标签,当一个标签匹配时,我尝试匹配=
符号之后的任何内容或\s
(spacer) 之后的任何内容,直到它到达 tag closure ]
。
现在我在这里尝试匹配内容。这是棘手的部分。我正在寻找任何不是 [ 的字符,如果找到任何字符,则检查它是否不是我的结束标签或递归,并告诉正则表达式引擎这样做,直到...。
...找到结束标签。
regex - 为什么这个递归正则表达式只在一个字符重复 2^n - 1 次时才匹配?
在阅读了polygenelubricants关于高级正则表达式技术的系列文章(特别是这个 Java 正则表达式如何检测回文?)后,我决定尝试使用递归(在 PHP 中)创建自己的 PCRE 正则表达式来解析回文。
我想出的是:
我对这个表达式的理解是它应该匹配零个或一个字符(每个少于 2 个字符的字符串都是隐含的回文,以及在递归中考虑具有奇数长度的回文),或者两个相同的字符分开通过模式的递归。
不幸的是,正如您在www.ideone.com/a9T3F中看到的那样,它似乎并没有那样工作。相反,只有 2 n - 1 个(即空字符串、a
、aaa
、aaaaaaa
、a 15)重复字符的字符串与正则表达式匹配。
奇怪的是,如果我修改我的模式以使递归是可选的(即^(([a-z])(?1)?\2|[a-z]?)$
,请参阅www.ideone.com/D6lJR,它只匹配具有重复 2 n次字符的字符串(即空字符串、a
、aa
、aaaa
、aaaaaaaa
、a 16) .
为什么我的正则表达式没有按我期望的方式工作?
对于那些渴望建议不要使用正则表达式的人的注意事项:
这个问题的重点是学习如何正确使用递归正则表达式。我知道这不是确定字符串是否为回文的有效方法,如果出于某种原因必须确定生产代码中的回文,我不会使用递归正则表达式;我只是有兴趣了解更多关于正则表达式的高级方面。
php - 我需要匹配什么 reg 表达式模式来匹配 {{ 和 }} 之间的所有内容
我需要匹配什么 reg 表达式模式来匹配 {{ 和 }} 之间的所有内容
我正在尝试解析维基百科,但在运行 rexex 代码后,我以孤儿 }} 告终。这是我的 PHP 脚本。
我认为问题是我嵌套了 {{ 和 }} 例如
{{ 东西 {{ 其他东西 {{ 新东西 }}{{ 旧东西 }} 蓝色的东西 }} 绿色的东西 }}
php - 嵌套的正则表达式...我一无所知!
我对 PHP 和正则表达式一无所知,但我正在尝试为我的论坛修复一个损坏的插件。
我想替换以下内容:
和
实际上,这部分很简单,我已经部分修复了插件来做到这一点。以下正则表达式用于调用以preg_replace_callback()
进行替换:
回调代码为:
这适用于我上面的示例(非嵌套块引用)。但是,如果块引用是嵌套的,例如在以下示例中:
它不起作用。所以我的问题是,如何使用正则表达式/PHP 的组合替换所有嵌套的块引用?我知道在 PHP 中递归模式是可能的(?R)
;以下正则表达式将从包含它们的字符串中提取所有嵌套的块引用:
但是从那里开始,我不太确定在preg_replace_callback()
回调中做什么来用上面的替换替换每个嵌套的块引用。
任何帮助,将不胜感激。
.net - 正则表达式解析任意深度的函数
我正在为其中包含的函数解析一种简单的语言(Excel 公式)。函数名必须以任意字母开头,后跟任意数量的字母/数字,并以左括号结尾(中间没有空格)。例如MyFunc(
. 该函数可以包含任何参数,包括其他函数,并且必须以闭括号结尾)
。当然,括号内的数学是允许的=MyFunc((1+1))
,(1+1)
不应该被检测为函数,因为它不符合我刚刚描述的函数规则。我的目标是识别公式中最高级别的函数调用,识别函数名称,提取参数。使用参数,我可以递归地查找其他函数调用。
使用本教程,我破解了以下正则表达式。似乎没有人能做到这一点。他们都在下面粘贴的测试用例中失败。
这应该有效,但完全失败:
这适用于许多测试用例,但不适用于下面的测试用例。我认为它不能正确处理嵌套函数 - 它只是在嵌套中查找打开的括号/关闭括号:
这是打破所有这些的测试:
这应该匹配为:
相反,它匹配:
我正在使用提供外部存储器的 .net RegEx。
ruby - 用于匹配最简单 Ruby 正则表达式的 Ruby 正则表达式
我想在Ruby脚本的文本中匹配正则表达式(至少是基本的,不是所有可能的类型......现在......)。
这就像一个...\/\^? oh my god... \$?\/[eimnosux]*
也许我在这里需要递归正则表达式。