用特殊字符替换精确字符串,而不是另一个子字符串的部分

时间:2017-06-20 17:22:08

标签: java regex string replace

我正在尝试从字符串中替换子字符串,如:

Sample string value '[1]T.1.v - Marriage Statement'!C10 and this

要替换的文字为'[1]T.1.v - Marriage Statement'!C10,其他字符串为var1,以便字符串变为Sample string value var1 and this。问题是可能存在像Sample string value '[1]T.1.v - Marriage Statement'!C101 and this这样的值的字符串,其中替换应该不起作用。 我正在探索边界正则表达式来限制替换:

String sample = "Value can be '[1]T.1.v - Marriage Statement'!C10 and this";
String a = sample.replaceAll("\\b'[1]T.1.v - Marriage Statement'!C10\\b", "var1");
System.out.println(a);

但这似乎根本没有取代这个词。我尝试过简单的字符串替换,但这会替换Sample string value '[1]T.1.v - Marriage Statement'!C101 and this中的子字符串,并将输出设为Sample string value var11 and this,这是一个错误。

有任何建议如何实现这一目标?

4 个答案:

答案 0 :(得分:4)

删除前导\b,然后使用\Q...\E转义序列将输入字符串视为文字:

String a = sample.replaceAll("\\Q" + param +"\\E\\b", "var1");

答案 1 :(得分:1)

单引号被视为单词边界,因此初始\\b锚点会阻止文本的其余部分匹配。

此外,您的文字本身包含大量特殊字符,因此quoted应为\\Q\\E

这是一个解决这些缺点的正则表达式:

"(?<=\\s|^)\\Q'[1]T.1.v - Marriage Statement'!C10\\E(?=\\s|$)"

它将最初的\\b替换为(?<=\\s|^),最后的\\b替换为(?=\\s|$),以允许目标字符串以非字字符开头和结尾,例如作为报价。使用\\Q\\E可以让我们在未转义的目标字符串的其余部分保留特殊字符。

Demo.

答案 2 :(得分:0)

转义括号和圆点

'\[1\]T\.1\.v - Marriage Statement'!C10

答案 3 :(得分:0)

两件事:

•将\\'中的replaceAll更改为\'

•将replaceAll(...更改为replace(...(参见帖子底部)

它应该是这样的:

public static void main(String[]args) {
    String sample = "Value can be '[1]T.1.v - Marriage Statement'!C10 and this";
    String a = sample.replace("\'[1]T.1.v - Marriage Statement\'!C10", "var1");
    System.out.println(a);
}

产生输出:

Value can be var1 and this

使用replaceAll会更好,如果你要替换一些事物的出现,例如字母A. replace如果它只是一个实例,那么它可以替换它。