在没有线性搜索的情况下找出 Java 正则表达式中的哪个组匹配?

For*_*imo 7 java regex regex-group

我有一些以编程方式组装的巨大正则表达式,就像这样

(A)|(B)|(C)|...
Run Code Online (Sandbox Code Playgroud)

每个子模式都在其捕获组中。当我得到匹配项时,如何确定哪个组匹配而不对每个组进行线性测试group(i)以查看它返回非空字符串?

Tho*_*mas 4

如果您的正则表达式是以编程方式生成的,为什么不以编程方式生成n 个单独的正则表达式并依次测试每个正则表达式呢?除非它们共享一个共同的前缀并且 Java 正则表达式引擎很聪明,否则所有替代方案都会经过测试。

更新:我刚刚浏览了 Sun Java 源代码,特别是 java.util.regex.Pattern$Branch.match(),这也只是对所有替代方案进行线性搜索,依次尝试每个替代方案。使用 Branch 的其他地方并不建议对公共前缀进行任何类型的优化。