java - 使用正则表达式查找字符串中的所有字母

标签 java regex

我知道 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/

相关文章:

javascript - 需要你帮助一个简单的 javascript 正则表达式

javascript - 正则表达式获取花括号之间的字符串

python - 我如何找到这个特定字符串的多次出现并将它们拆分成一个列表?

java - Spring Autowiring : Caused by: java. lang.IllegalArgumentException:无法设置空TableModel

java - Eclipse 风格的选项卡式 Pane ——选项卡太多时的 "Show List"按钮

java - 灰熊服务器异常

java - 通过查看内置类的编译器代码来编写优化代码的示例

javascript - 正则表达式提取登录用户名

java - 创建正则表达式匹配数组

java - 服务器启动后(自动)添加 VM 参数