示例代码,我尝试验证字符串是否为有效的整数
public static boolean isValidNumberUsingRegex(String num) {
return num.matches("[-+]?\\d+(\\.\\d+)?");
}
matches
的时间复杂度是多少?
答案 0 :(得分:5)
这取决于正则表达式引擎的实现。假设没有任何真正笨拙的发生(例如,在这个正则表达式中不应该有回溯函数),我会说你的表达式产生的DFA会接受/拒绝O(n)中的任何字符串。 / p>
这里描述了Regexper的表达式:
请注意,没有办法说明一般正则表达式的复杂性。一些正则表达式需要回溯,你可以制作指数时间匹配的表达式。所以我的回答适用于这个特定的表达式,这个特定的表达式(实际上是任何特定的表达式)被编译成O(1)中的DFA。
答案 1 :(得分:0)
通常在正则表达式实现中,在构造模式时构造DFA,然后使用该DFA来匹配给定的字符串。
如果按原样保留方法,它可能一直接近O(n * m),其中n是模式的长度,m是字符串的长度,因为DFA需要每次建造。另一方面,如果您使用Pattern类预编译DFA,那么您可以获得更好的结果。
就复杂性而言,一旦预编译了模式,就应该采用以下复杂性:
在匹配时,至少需要O(m)时间,其中m是字符串的长度
在不匹配(非数字)上,您可以在O(1)和O(m-1)之间的任何时间实现,具体取决于模式从DFA中脱落的位置。
如果您对如何创建DFA感兴趣,建议您观看此视频。我发现学习时很有帮助: