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

梅丽·阿尔汀塔斯

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

两个正则表达式正在执行相同的工作。为什么第一个正则表达式比第二个更快速?感谢您的回答。

易卜拉欣·纳杰尔(Ibrahim Najjar)

我永远不能百分百确定,但是我可以想到一个原因。

(?!^) 总是失败或一次射击成功(一次尝试),也就是说,如果它找不到仅是一次测试的字符串开始。

至于(?<=\\G.{1}) (恰好等于(?<=\\G.)),它总是涉及两个步骤或两次匹配尝试。

\\G无论是在字符串开头还是在上一个匹配项的末尾匹配,即使成功,regex引擎仍必须尝试匹配单个字符.

例如,在您的string中123456,在字符串的开头:

  • (?!^):立即失败。
  • (?<=\\G.)\\G成功,但随后却.在后面寻找但找不到字符,因为这是字符串的开头,因此现在失败了,但是您可以看到它尝试了两个步骤,而上一个表达式尝试了一个步骤。

输入字符串中的每个其他位置也是如此。始终要进行两次测试,(?<=\\G.)而对于进行一次测试(?!^)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用正则表达式查找字符串中不包含特定字母的所有单词

查找字符串中的所有大写字母-正则表达式C#

使用正则表达式查找字符串中的所有匹配项

使用正则表达式查找字符串中的所有匹配项

python使用正则表达式查找字符串中的字母

使用正则表达式查找字符串中的可变字母组

正则表达式以所有顺序查找字符串

通过正则表达式查找字符串中的所有电话号码

Python-正则表达式查找字符串中的所有匹配项并替换

使用Javascript以任意顺序使用正则表达式查找字符串中的所有匹配项

使用Java正则表达式查找字符串中的所有<a href> link </a>

查找字符串的正则表达式以字母开头,以斜杠/结束

查找字符串c#中的所有子字符串(正则表达式,字符数组?)

正则表达式:在不同的字符串变体中查找字符串

PHP正则表达式-在字符串中查找字符串

正则表达式查找字符串中的第一个字母

查找所有字符串的正则表达式是在Java中以$开头的正则表达式

用正则表达式查找字符串并删除整行

PHP正则表达式:查找字符串中所有连续的数字序列吗?

使用正则表达式查找字符串中的确切字符

正则表达式在Python 3中的列表中查找字符串

Java中的正则表达式查找字符串中的冒号

正则表达式:查找文本中的所有子字符串

使用正则表达式在字符串中查找所有出现的日期

正则表达式查找带引号的字符串中的所有大括号

使用正则表达式查找并替换字符串中模式的所有实例

正则表达式在长字符串中查找所有与金钱相关的值

正则表达式-查找字符串中的大写单词

Golang正则表达式以查找字符串中的网址