【问题标题】:ReplaceAll when it is not alpha charactersReplaceAll 当它不是字母字符时
【发布时间】:2019-07-13 10:54:56
【问题描述】:

我需要替换字符串中所有出现在非字母字符(数字、空格...等)之间或字符串开头或结尾的单词的 $0。但是,当我使用 replaceAll 时,我的 Regex 模式似乎不起作用。

我尝试了几种在网上找到的解决方案,例如 Pattern.quote,但该模式似乎不起作用。但是,它在https://regexr.com/ 上完美运行

public static final String REPLACE_PATTERN = "(?<=^|[^A-Za-z])(%s)(?=[^A-Za-z]|$)";

String patternToReplace = String.format(REPLACE_PATTERN, "a");

inputString = inputString.replaceAll(Pattern.quote(patternToReplace), "$0");

例如,用字符串和单词“a”:

a car4is a5car

我希望输出是:

$0 car4is $05car

【问题讨论】:

    标签: java regex replaceall


    【解决方案1】:

    只需将inputString.replaceAll(Pattern.quote(patternToReplace), "$0"); 更改为inputString.replaceAll(patternToReplace, "\\$0");

    我已经用这段代码测试过:

    public static final String REPLACE_PATTERN = "(?<=^|[^A-Za-z])(%s)(?=[^A-Za-z]|$)";
    String patternToReplace = String.format(REPLACE_PATTERN, "a");
    inputString = inputString.replaceAll(patternToReplace, "\\$0");
    System.out.println(inputString);
    

    输出:

    $0 car4is $05car
    

    希望对你有帮助:)

    【讨论】:

      【解决方案2】:

      当你想用"$0"替换字符串的匹配部分时,你必须写它
      "\\$0"。这是因为$0 有一个特殊的含义:匹配的字符串。所以你自己替换字符串。

      【讨论】:

        【解决方案3】:

        您引用了错误的内容。您不应该引用该模式。您应该引用"a" - 应该字面意思处理的模式部分。

        String patternToReplace = String.format(REPLACE_PATTERN, Pattern.quote("a"));
        

        如果您永远不会在format 的第二个参数中添加任何其他字母,那么您根本不需要quote,因为字母在正则表达式中没有特殊含义。

        另外,$作为替代品有特殊含义,需要转义:

        inputString = inputString.replaceAll(patternToReplace, "\\$0");
        

        【讨论】:

          【解决方案4】:

          Pattern.quote() 返回正则表达式文字,其间的所有内容都是 treated like a text

          您应该使用Matcher 替换所有出现的字符串。除此之外,正如@Donat 指出的那样,$0 被视为正则表达式变量,因此您需要对其进行转义。

          inputString = Pattern.compile(patternToReplace).matcher(inputString).replaceAll("\\$0");
          

          【讨论】:

            猜你喜欢
            • 2014-02-02
            • 2020-12-27
            • 2016-07-24
            • 2021-03-28
            • 2015-02-20
            • 1970-01-01
            • 2013-02-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多