我知道toCharArray()
方法,但对正则表达式感兴趣。我对两个正则表达式的速度有疑问:
String s = "123456";
// Warm up JVM
for (int i = 0; i < 10000000; ++i) {
String[] arr = s.split("(?!^)");
String[] arr2 = s.split("(?<=\\G.{1})");
}
long start = System.nanoTime();
String[] arr = s.split("(?!^)");
long stop = System.nanoTime();
System.out.println(stop - start);
System.out.println(Arrays.toString(arr));
start = System.nanoTime();
String[] arr2 = s.split("(?<=\\G.{1})");
stop = System.nanoTime();
System.out.println(stop - start);
System.out.println(Arrays.toString(arr2));
输出:
Run 1:
3158
[1, 2, 3, 4, 5, 6]
3947
[1, 2, 3, 4, 5, 6]
Run 2:
2763
[1, 2, 3, 4, 5, 6]
3158
[1, 2, 3, 4, 5, 6]
两个正则表达式正在执行相同的工作。为什么第一个正则表达式比第二个更快速?。感谢您的回答。
我永远不能百分百确定,但是我可以想到一个原因。
(?!^)
总是失败或一次射击成功(一次尝试),也就是说,如果它找不到仅是一次测试的字符串开始。
至于(?<=\\G.{1})
(恰好等于(?<=\\G.)
),它总是涉及两个步骤或两次匹配尝试。
\\G
无论是在字符串开头还是在上一个匹配项的末尾匹配,即使成功,regex引擎仍必须尝试匹配单个字符.
。
例如,在您的string中123456
,在字符串的开头:
(?!^)
:立即失败。(?<=\\G.)
:\\G
成功,但随后却.
在后面寻找但找不到字符,因为这是字符串的开头,因此现在失败了,但是您可以看到它尝试了两个步骤,而上一个表达式尝试了一个步骤。输入字符串中的每个其他位置也是如此。始终要进行两次测试,(?<=\\G.)
而对于进行一次测试(?!^)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句