【发布时间】:2017-08-22 19:22:02
【问题描述】:
我需要从给定的正则表达式中提取所有允许的字符列表。
例如,如果正则表达式看起来像这样(一些随机示例):
[A-Z]*\s+(4|5)+
输出应该是
ABCDEFGHIJKLMNOPQRSTUVWXYZ45
(省略空格)
一个明显的解决方案是定义一组完整的允许字符,并使用find 方法返回每个字符的相应子序列。不过,这似乎是一个有点枯燥的解决方案。
谁能想到一个(可能很简单的)算法来实现这个?
【问题讨论】:
-
您需要代码(使用哪种语言?)还是只是一个想法?你有没有想过?
-
我实际上只是在寻找一个想法。它所使用的语言并不那么重要。
-
所以基本上你要求的是一种被称为正则表达式解释器的算法......我认为你不会得到任何正确的答案......你真正需要做的是非常了解正则表达式很好(如果你不这样做)并相应地实现你的解释器。该算法将是,从正则表达式的左侧开始读取并读取到正则表达式的末尾,同时解释当前和之前和之后的字符
-
这里没有简单的解决方案......你的任务将接近于制作一个正则表达式引擎......除非你找到任何开源引擎(你可以用谷歌搜索一下)
-
我偶然发现的一个 Java 库能够执行该任务。但由于它不是问题的答案,我将其作为评论发布,因为它可能对某人有所帮助:brics.dk/automaton/index.html 有了这个你可以做
Automaton automaton = new RegExp(regex).toAutomaton();,然后用Set<String> strings = automaton.singleChars().getFiniteStrings();检索一组字符跨度>