【发布时间】:2012-11-16 10:01:53
【问题描述】:
有没有办法解析一个复杂的正则表达式模式(包含几个named groups 以及几个numbered groups 和non-capturing groups)并报告每个groupname 或groupnumber 以及模式文本。
假设,我确实有这样的 RegEx 模式:
(?im)(?<x>\b[a-s03]+\b)(?-i)(?<a>\p{L}+?,(?<b>.+?:(?<c>.+?;(?<d>.+?(?:\d|sample-text|(\k'x'|sos30))))))
我喜欢提取:=
Named groups:
x==>(?<x>\b[a-s03]+\b)
a==>(?<a>\p{L}+?,(?<b>.+?:(?<c>.+?;(?<d>.+?(?:\d|sample-text|(\k'x'|sos30))))))
b==>(?<b>.+?:(?<c>.+?;(?<d>.+?(?:\d|sample-text|(\k'x'|sos30)))))
c==>(?<c>.+?;(?<d>.+?(?:\d|sample-text|(\k'x'|sos30))))
d==>(?<d>.+?(?:\d|sample-text|(\k'x'|sos30)))
Numbered groups:
1==>(\k'x'|sos30)
Non-capturing-groups:
1st==>(?:\d|sample-text|(\k'x'|sos30))
此要求的目的:
我确实有一个包含复杂 RegEx 模式的大型数据库。以前的程序在准备这些复杂模式时没有使用任何注释 [(?#...)],而且这些模式中不存在linebreaks。在某些情况下,我必须修改这些模式,并且还必须在这些模式中使用注释。现在它就像在干草堆中寻找针一样。我根本无法为此目的使用 RegEx。因此,我倾向于在这种情况下使用解析器。
我尝试了什么:
我为此尝试了GetGroupNames 和GetGroupNumbers 集合。我只能提取groups 中的Names/Numbers,但不能提取相应的文本模式。
我正在寻找非正则表达式解决方案/一些提示。
【问题讨论】:
-
我不知道任何现有的解析正则表达式的解决方案。尽管如果您简单地遍历该行,捕获左括号并查找相应的右括号,自己制作类似的东西可能不会非常困难。根据文本模式,您可以看到它是什么类型的组。
-
@Patrickdev:感谢您抽出宝贵的时间发表评论。实际上,我描述的示例是一个非常简单的示例,根本没有
parenthesis,因为实际模式要复杂得多(主要是嵌套结构和很多括号以及转义的括号)。但是,是的,我同意你关于准备一个新的 Parser 的建议。但是,这就像重新发明轮子一样。如果没有其他解决方案,我当然会考虑。 -
看看regex101.com - 这里可能会有所帮助。
-
@Lindrian:感谢您的评论。但是,我确实需要一个
RegEx parser,通过它我可以解析大量的复杂正则表达式模式。就我个人而言,我确实使用Regexbuddy来创建和编辑正则表达式模式,我相信这是一个必须拥有的最佳工具,在这方面非常具有解释性。但是,我不会为此手动工作。而且你提到的网站很多pythonic,我也需要.NET compatible regex engine。