我知道 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]
两个正则表达式在做同样的工作。为什么第一个正则表达式比第二个快? .感谢您的回答。
最佳答案
我永远无法 100% 确定,但我能想到一个原因。
(?!^)
总是一次失败或成功一次(一次尝试),也就是说,如果它找不到字符串的开头,这只是一次测试。
至于 (?<=\\G.{1})
(完全等同于 (?<=\\G.)
),它总是涉及两个步骤或两次匹配尝试。
\\G
匹配字符串的开头或上一个匹配的结尾,即使成功,正则表达式引擎仍然必须尝试匹配单个字符 .
。
例如,在您的字符串 123456
中,在字符串的开头:
-
(?!^)
:立即失败。 -
(?<=\\G.)
:\\G
成功,但随后它寻找.
但找不到后面的字符,因为这是字符串的开头,所以现在它失败了,但正如您所看到的,它尝试了两步而不是一步以前的表达。
输入字符串中的每个其他位置也是如此。始终对 (?<=\\G.)
进行两次测试,而对 (?!^)
进行一次测试。
关于java - 使用正则表达式查找字符串中的所有字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18933469/