我目前正在开发一个简化创建正则表达式模式的库。
为了生成最清晰的模式,我想在可能的情况下简化量词。假设已发出以下子模式:
(?:\d+)?
以上内容可简化为\d*
,但假设(?:ℝ+)?
始终可以简化为ℝ*
也是正确的,其中ℝ
是任意的(括号内) ,如有必要)正则表达式?
如果是,对于以下情况应该如此,对吧?
(?:ℝ+)?
=> ℝ*
(?:ℝ+)*
=> ℝ*
(?:ℝ+)+
=> ℝ+
(?:ℝ*)?
=> ℝ*
(?:ℝ*)*
=> ℝ*
(?:ℝ*)+
=> ℝ*
(?:ℝ?)?
=> ℝ?
(?:ℝ?)+
=> ℝ*
(?:ℝ?)*
=> ℝ*
答案 0 :(得分:2)
我建议将量词转换为( m , n )重复计数:
*
是(0,∞),+
是(1,∞)和?
是(0,1)。然后制定组合量词的规则。一般来说,(ℝ{m1, n1}){m2, n2}
是什么?如果 m 1 和 m ℝ{m1·m2, n1·n2}。 > 2 大于1.
答案 1 :(得分:1)
是的,你是对的。而且你应该总是使用较小的一个,因为嵌套的重复很容易catastrophic backtracking。因此,除了不同的执行行为,它们将匹配相同的语言。