【问题标题】:Replacing a string with the regular expression ".*" returns the replacement twice [duplicate]用正则表达式“。*”替换字符串会返回替换两次[重复]
【发布时间】:2013-04-22 10:05:40
【问题描述】:

鉴于此代码:

String replaced = "A".replaceAll(".*", "HI");

为什么replaced 包含字符串HIHI 而不是我猜到的HI?由于使用模式^.* 产生HI,这似乎与行首有关,但我不明白这是为什么。

【问题讨论】:

  • 可以使用.+防止空字符串("")被匹配。

标签: java regex


【解决方案1】:

认为这是因为.*首先匹配整个字符串,然后匹配字符串末尾的空字符串。当然,^.* 不会匹配 "A" 末尾的空字符串,所以你最终只会得到一个 "HI"。

【讨论】:

    【解决方案2】:

    查看replaceAll javadoc:用给定的替换替换此字符串中与给定正则表达式匹配的每个子字符串。 这匹配两个子字符串:“”和“A”。 你可以通过测试看到这一点

    String replaced = "".replaceAll( ".*", "HI" );
    

    这会导致打印一个“HI”

    【讨论】:

    • 在“A”中有两个位置(可以说是在字母之间):0 和 1。在 0 处“A”匹配,在 1 处“”匹配。
    • @JoopEggen 无论如何,这是违反直觉的。如果.* 是贪婪的,它应该“吃掉”整个字符串包括末尾的空字符串并返回一次匹配。
    • 两个空字符串"A".replaceAll("", "HI")==HIAHI
    • @AdamDyga "greedy"(匹配最长的可能字符串)在位置 0,但在位置 1 再次开始匹配。
    【解决方案3】:

    Matcher类的find方法找到“A”和“A”后面的一个空String,所以有2个替换。

    【讨论】:

      【解决方案4】:

      replaceAll 方法采用正则表达式和替换参数,如 (read more):-

      public String replaceAll(String regex,
                               String replacement)
      

      在本例中,.* 表示正则表达式。

      . 表示任何字符(可能匹配行终止符,也可能不匹配)

      * 表示零次或多次(Read More regexp

      您给定代码的输出是正确的。正则表达式与 * 匹配表示零次或多次。而且会影响结果。

      String replaced = "A".replaceAll(".*", "HI");
      

      输出:- HIHI

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-13
        • 2023-04-09
        • 1970-01-01
        • 2012-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        相关资源
        最近更新 更多