我希望能够通过给定的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库(对于它的价值)。
是的,我想到了。这实际上与自己构建DFA的前端一样。也许我会做到这一点,如果它归结为它,但我宁愿找到一个更简单的解决方案。 – 2009-04-24 19:11:00
我不确定它比解析它要简单多少(根据语言标准的固定语法)和一些非常明显的递归,但也许这只是我的编译器 - 构建注入大脑 – Tetha 2009-04-24 19:16:13