我希望能够计算由java.util.regex.Pattern
的给定实例在字符串中作为第一个字符匹配的所有字符的集合。更正式地说,假设DFA等价于某个正则表达式,我想要从开始状态开始的所有传出转换的集合。
一个例子:
Pattern p = Pattern.compile("[abc]def|daniel|chris|\\s+");
Set<Character> first = getFirstSet(p);
集合first
应包含以下元素:
{ 'a', 'b', 'c', 'd', ' ', '\n', '\r', '\t' }
有什么想法吗?我很清楚我可以自己构建DFA并确定相关的状态,但我想避免那种麻烦(读:这对我来说不值得)。请注意,我的宿主语言实际上是Scala,所以我可以访问所有核心Scala库(为了它的价值)。
答案 0 :(得分:4)
我认为你可以解析正则表达式并定义一些递归函数,它以从左到右的方式对解析后的正则表达式进行操作,构建了这样一组第一。
有些事情很简单:
将此扩展为正则表达式方言所知道的所有原语和特殊标志,并且你很高兴。
答案 1 :(得分:1)
你可以递归地解决它......
这个想法可能有很多错误,但这是我会尝试的。你必须删除断言,组名和其他数千个东西。如果你找到像[^ 0-9]这样的倒置字符类,你必须输出很多字符。
所以我认为这确实是一个复杂的问题。