【问题标题】:What is the effect of "*" in regular expressions?正则表达式中的“*”有什么作用?
【发布时间】:2009-02-03 14:24:50
【问题描述】:

我的 Java 源代码:

String result = "B123".replaceAll("B*","e");
System.out.println(result);

输出为:ee1e2e3e。 为什么?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    '*' 表示前一个字符的零个或多个匹配。所以每个空字符串都会被替换成一个“e”。

    您可能想使用“+”代替:

    replaceAll("B+", "e")

    【讨论】:

    • 99% 正确...这是一个贪婪的搜索,所以如果它可以匹配“B”,它会。否则,输出将是“eee1e2e3e”
    • ':' 可能是复制粘贴错误,提供的代码不能生成':' ...
    • 我不认为 : 应该被解释为输出的一部分。
    • 空字符串在哪里?像这样:“B 1 2 3”?
    • 正则表达式解析器将逐个字符地检查您的字符串。在位置 0 它将用 'e' 替换 'B',在位置 1 它将用 'e' 替换 '',依此类推。
    【解决方案2】:

    你想要这个作为你的模式:

    B+
    

    你的代码是:

    String result = "B123".replaceAll("B+","e");
    System.out.println(result);
    

    “*”匹配“零或多个” - 而“零”包括 B 之前以及所有其他字符之间的空。

    【讨论】:

    • 第一次尝试时,正则表达式会使用“B”,而不是空字符串。然后它匹配每个位置的空字符串,从第一个匹配停止的位置开始。
    【解决方案3】:

    我在一家大型科技公司工作了一个多月,修复了正则表达式中带有 * (splat!) 的错误。我们维护了一个鲜为人知的 UNIX 操作系统。我的头几乎要爆炸了,因为它匹配零次与角色的相遇。谈论一个很难通过您自己的重新创建来理解的错误。在某些情况下,我们进行了双重替代。我不知道为什么代码是错误的,但能够添加捕获特殊(错误)情况的代码并防止双重替换,并且没有破坏任何包含它的实用程序(包括 sed 和 awk)。我很自豪能够修复这个错误,但正如我已经提到的那样。

    看在上帝的份上,请使用 + !!!!

    【讨论】:

    • 是的,双重匹配的事情很奇怪。在我学会注意它之前,它把我扔了几次。如果可以的话,+1 表示始终使用 + 而不是 *。
    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2014-06-01
    • 1970-01-01
    • 2016-03-12
    • 2015-04-13
    • 2014-06-01
    相关资源
    最近更新 更多