Java中的反向正则表达式
如何在Java中反转正则表达式?例如,“ab.+de”=>“ed.+ba”。事实上,倒干草堆要比倒针容易得多。由于Java中的反向正则表达式,java,regex,reverse,Java,Regex,Reverse,如何在Java中反转正则表达式?例如,“ab.+de”=>“ed.+ba”。事实上,倒干草堆要比倒针容易得多。由于Matcher采用CharSequence而不是String,因此只需简单地包装String(请参阅的答案)即可轻松完成此操作 有了这些知识,您可以创建另一个版本的Matcher,它看起来像是在反转模式,但实际上只是反转输入。哇 您需要为正则表达式构建一个解析器,并反转所有标记/部分 在这种情况下 ab.+de是 a,b,.+,d,e 反过来说,这是 e、 d、.+、b、a 现在想象
Matcher
采用CharSequence
而不是String
,因此只需简单地包装String
(请参阅的答案)即可轻松完成此操作
有了这些知识,您可以创建另一个版本的Matcher
,它看起来像是在反转模式,但实际上只是反转输入。哇
您需要为正则表达式构建一个解析器,并反转所有标记/部分
在这种情况下
ab.+de是
a,b,.+,d,e
反过来说,这是
e、 d、.+、b、a
现在想象一下团队
((ab)(.+de))
反之亦然
((ed.+)(ba))正确,需要处理反向引用、捕获组和命名组。命名组由于Java正则表达式中不限制命名组需要通过名称进行反向引用,因此可以像任何其他捕获组一样通过编号进行反向引用
如果有人对Java解决方案感兴趣,我实现了一个库来实现这一点
处理所有有效的Java正则表达式构造,并提供实用程序类来包装模式、匹配器和输入,以进行反向搜索,以处理所有需要的映射和反转。+1似乎是一个很好的解决方案:保持递归反转子组,然后将子组连接在一起(反向)在备份堆栈的过程中。特殊的正则表达式,比如(?是的,我只为正则语言的真正正则表达式实现它。它基本上就是级联(
.abc
)、交替(.a | b | c
)和有限计数({.2}.a+b?c{,3}/code>).Nope,这些也不是真正的正则语言的一部分。除非您可以使用三个规则来实现它:串联、交替和有限计数(分组也可以与其中任何一个结合使用),它不是真正的正则表达式,因为它定义了比正则语言更具表现力的东西。如果有人对Java解决方案感兴趣,我实现了一个库来实现这一点。处理所有有效的Java正则表达式构造,并提供工具类来包装模式和匹配器,以便进行反向搜索,以处理所有需要的映射和反向我需要这样做来实现向后搜索。