将整个单词与前导或尾随特殊符号(如字符串中的美元)匹配

时间:2018-04-17 23:16:59

标签: java regex replaceall

我可以使用Matcher.quoteReplacement.替换美元符号我可以通过添加边界字符来替换单词:

from = "\\b" + from + "\\b"; 
outString = line.replaceAll(from, to);

但我似乎无法将它们结合起来用美元符号代替单词。

这是一个例子。我正在尝试替换" $temp4" (不是$temp40)与" register1"。

        String line = "add, $temp4, $temp40, 42";
        String to = "register1";
        String from = "$temp4";
        String outString;


        from = Matcher.quoteReplacement(from);
        from = "\\b" + from + "\\b";  //do whole word replacement

        outString = line.replaceAll(from, to);
        System.out.println(outString);

输出

"add, $temp4, $temp40, 42"

如何让它替换$ temp4而只取回$ temp4?

4 个答案:

答案 0 :(得分:4)

使用明确的字边界,(?<!\w)(?!\w),而不是依赖于上下文的\b

from = "(?<!\\w)" + Pattern.quote(from) + "(?!\\w)";

请参阅regex demo

如果在当前位置的左侧有一个非单词字符,而(?<!\w)是一个负面的预测,如果有匹配就会失败紧靠当前位置右侧的非单词字符。 (?!\w)是必要的,以逃避Pattern.quote(from)变量中的任何特殊字符。

请参阅Java demo

from

答案 1 :(得分:1)

Matcher.quoteReplacement()用于替换字符串(to),而不是正则表达式(from)。要在正则表达式中包含字符串文字,请使用Pattern.quote()

from = Pattern.quote(from);

答案 2 :(得分:1)

$在正则表达式中具有特殊含义(表示“输入结束”)。要从目标中的字符中删除任何特殊含义,请将其包装在regex quote / unquote表达式\Q...\E中。另外,因为$不是“单词”字符,所以单词边界不会被wiork,所以请改用环顾四周:

line = line.replaceAll("(?<!\\S)\\Q" + from + "\\E(?![^ ,])", to);

答案 3 :(得分:0)

通常情况下,Pattern.quote是转义可能由正则表达式引擎特别解释的字符的方法。

但是,正则表达式仍然不正确,因为$中的line之前没有单词边界;空格和$都是非单词字符。您需要在 $字符之后放置边界。这里不需要Pattern.quote,因为你自己逃避了。

String from = "\\$\\btemp4\\b";

或者更简单,因为您知道$temp4之间已存在单词边界:

String from = "\\$temp4\\b";

from变量可以从要替换的表达式构造。如果from"$temp4",那么您可以转义美元符号并添加字边界。

from = "\\" + from + "\\b";

输出:

add, register1, $temp40, 42