为什么正则表达式((x,y)|(x,z))是不确定的?

J.z*_*hou 8 java regex

为什么正则表达式((x,y)|(x,z))是不确定的,正如"核心Java"这本书所说的那样?作者给出了他的观点:

当解析器看到x时,它不知道要采用哪两个替代方案.这个表达式可以以确定的形式重写为(x,(y | z))

任何人都可以给我一个解释吗?

Pin*_*895 11

要获得确定性形式,您只能在当前位置拥有最多一种可能的方式.假设你有一个字符串" x,y ".现在正则表达式引擎查看第一个字符" x ".在你的表达式中,你有两种可能性,你的字符串可以在第一个位置的" x " 之后接受你的输入.接下来有2种方法可供检查.如果字符串后跟" ,y "或" ,z ".

   , ? y
 ?
x
 ?
   , ? z
Run Code Online (Sandbox Code Playgroud)

对于(x,(y | z)),你总是只有一种方式.如果" x "在位置1上,则转到位置2.同样在那里,只有" , ".最后他必须检查位置3上是否有" y "或" z "来接受这个词.从来没有两种方式.

x ? , ? (y or z)
Run Code Online (Sandbox Code Playgroud)