我可以确定正则表达式匹配的第一个字符集吗?

时间:2009-04-24 19:00:02

标签: java regex scala automata dfa

我希望能够计算由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库(为了它的价值)。

2 个答案:

答案 0 :(得分:4)

我认为你可以解析正则表达式并定义一些递归函数,它以从左到右的方式对解析后的正则表达式进行操作,构建了这样一组第一。

有些事情很简单:

  • 顺序:第一个(r1r2)=第一个(r1)+(如果第一个(r1)中的''(r2)其他空集)
  • 轮换:首先(r1 | r2)=第一(r1)+第一(r2)
  • 迭代:first(r *)= first(r)+''
  • 字符:first(c)= c
  • 字符类:first([c1-cn])= set(c1,c2,...,cn) ...

将此扩展为正则表达式方言所知道的所有原语和特殊标志,并且你很高兴。

答案 1 :(得分:1)

你可以递归地解决它......

  • 封闭括号的条带并递归调用。
  • 拆分顶级替代方案,并为每个部分进行递归调用。
  • 如果没有其他选择,
    • 输出从左到右开始的所有符号到第一个无可选符号。
    • 如果有charachter组,则输出所有符号。

这个想法可能有很多错误,但这是我会尝试的。你必须删除断言,组名和其他数千个东西。如果你找到像[^ 0-9]这样的倒置字符类,你必须输出很多字符。

所以我认为这确实是一个复杂的问题。