我想在Java中使用str.replaceAll替换引号之外的字符串,但是不要触及引号内的单词
如果我用Pie代替Apple:
输入:Apple" Apple Apple Apple"
期望的产出:Pie" Apple Apple Apple"
请注意引号内的字词不受影响
如何做到这一点?所有帮助赞赏!
答案 0 :(得分:6)
使用前瞻搜索Apple
以确保其未被引号括起:
(?=(([^"]*"){2})*[^"]*$)Apple
并替换为:
Pie
<强>更新强>
根据以下评论,您可以使用:
<强>代码:强>
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");
答案 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 "