如何替换行情之外的单词

时间:2015-02-27 18:02:36

标签: java regex string

我想在Java中使用str.replaceAll替换引号之外的字符串,但是不要触及引号内的单词

如果我用Pie代替Apple:

输入:Apple" Apple Apple Apple"
期望的产出:Pie" Apple Apple Apple"

请注意引号内的字词不受影响

如何做到这一点?所有帮助赞赏!

5 个答案:

答案 0 :(得分:6)

使用前瞻搜索Apple以确保其未被引号括起:

(?=(([^"]*"){2})*[^"]*$)Apple

并替换为:

Pie

RegEx Demo


<强>更新

根据以下评论,您可以使用:

<强>代码:

String str = "Apple \"Apple\"";
String repl = str.replaceAll("(?=(([^\"]*\"){2})*[^\"]*$)Apple", "Pie");
//=> Pie "Apple" "Another Apple Apple Apple" Pie

答案 1 :(得分:0)

我认为这就是你想要的:

String str = "Apple \"Apple\"";
String replace = str.replaceAll("(?<!\")Apple(?!\")", "Pie");

以下是工作:https://regex101.com/r/kP0oV1/2

答案 2 :(得分:0)

这适用于您的测试:

package mavensandbox;


import static junit.framework.TestCase.assertEquals;

public class Test {

    @org.junit.Test
    public void testName() throws Exception {
        String input = "Apple(\"Apple\")";
        String output = replaceThoseWithoutQuotes("Apple", "Pie", input);
        assertEquals("Pie(\"Apple\")", output);
    }

    private String replaceThoseWithoutQuotes(String replace, String with, String input) {
        return input.replaceAll("(?<!\")" + replace + "(?!\")", with);
    }
}

我正在使用名为negative lookahead and a negative lookbehind的内容。它找到了没有&#34;在它的前面或后面。这对你有用吗?

答案 3 :(得分:0)

尝试将单词与后面的空格进行匹配。

/苹果\ S /

然后用Pie替换相同的空格。

答案 4 :(得分:0)

如果您正在寻找更具迭代性的解决方案,如果您非常倾向,那么也可以选择不使用更复杂的正则表达式。您可以拆分"并替换偶数编号的索引,然后重建字符串。

    String input = "\"unique\" unique unique \"unique\" \"unique\" \"unique\" \"unique\" unique \"unique unique\" unique unique \"";
    System.out.println(input);
    String[] split = input.split("\"");
    for (int i = 0; i < split.length; i = i + 2) {
        split[i] = split[i].replaceAll("unique", "potato");
    }
    String output = "";
    for (String s : split) {
        output += s + "\"";
    }
    System.out.println(output);

输出:

"unique" unique unique "unique" "unique" "unique" "unique" unique "unique unique" unique unique "
"unique" potato potato "unique" "unique" "unique" "unique" potato "unique unique" potato potato "