【发布时间】:2013-12-29 23:29:43
【问题描述】:
我在形式语言方面有一点背景,最近我发现 Java 和其他语言使用所谓的扩展正则语言。由于我的背景,当我为Pattern 调用compile 时,我总是假设在Java 等语言中它会在后台生成一个DFA 或Transducer。结果,我总是假设无论我的正则表达式多么丑陋,无论我的正则表达式、Pattern.matches 或类似方法会在线性时间内运行多长时间。但这个假设似乎是incorrect。
我读到的post 似乎暗示一些正则表达式确实在线性时间内运行,但我并不完全相信或信任一个人。
我最终会编写自己的 Java 形式正则表达式库(我发现现有的只有 GNU GPL 许可证),但与此同时,我对 Java/C# 正则表达式的时间复杂度有一些疑问。想确保我读到的elsewhere 是正确的。
问题:
- 像 \sRT\s. 这样的形式语言,Java/C# 中正则表达式的匹配方法会在线性时间还是非线性时间解决隶属关系?
- 一般来说,我如何知道给定正则语言的表达式成员问题是否是正则表达式的线性时间?
我做文本分析,发现 Java 正则表达式不是 DFA 的,真是令人沮丧。
【问题讨论】:
-
这可能是cs.stackexchange.com的问题
-
我很久以前就了解了 DFA,我记得他们可以告诉你模式是否匹配,但他们无法返回捕获组所需的额外信息,这些信息非常 重要。捕获组是正则表达式具有“贪婪”和“不情愿”限定符的原因(即
.*与.*?);如果匹配的唯一目的是返回真/假,那么这些将无关紧要,并且它们与 DFA 无关。然而,那是几十年前的事了,我不知道从那以后 DFA 理论发展了多少。 -
@ajb 您可能一直在处理简化的 DFA。例如,Mealy Automata 可用于输出等效的捕获组。我相信扩展正则表达式和正式正则语言的唯一区别就是反向引用。
-
@hatchet 我你建议我把这个转发到那里?
-
您可能对this series of articles感兴趣。
标签: c# java regex time-complexity