我希望能够通过给定的java.util.regex.Pattern实例计算可以匹配为字符串中第一个字符的所有字符集.更正式地说,假设DFA等价于某个正则表达式,我想要从开始状态开始的所有传出转换的集合.
一个例子:
Pattern p = Pattern.compile("[abc]def|daniel|chris|\\s+");
Set<Character> first = getFirstSet(p);
首先应该包含以下元素:
{ 'a', 'b', 'c', 'd', ' ', '\n', '\r', '\t' }
有任何想法吗?我很清楚我可以自己构建DFA并确定相关的状态,但我想避免那种麻烦(读:这对我来说不值得).请注意,我的宿主语言实际上是Scala,因此我可以访问所有核心Scala库(因为它的价值).
解决方法:
我认为你可以解析正则表达式并定义一些递归函数,它以从左到右的方式对解析后的正则表达式进行操作,构建了这样一组第一.
有些事情很简单:
>序列:第一个(r1r2)=第一个(r1)(如果第一个(r1)中的”(r2),则为空集)
>轮换:首先(r1 | r2)=第一个(r1)第一个(r2)
>迭代:第一个(r *)=第一个(r)”
>字符:第一个(c)= c
> Characterclasses:first([c1-cn])= set(c1,c2,…,cn)
…
将此扩展为您的正则表达方言所知道的所有原语和特殊标志,并且您很高兴.