我想在Java中使用String.replaceAll(regex,regex)而不是(regex,String)

Ari*_*iou 3 java string replace

例:

input = "10N10N";
input = input.replaceAll("1|N", "N|1"); // syntax not correct
Run Code Online (Sandbox Code Playgroud)

预期产量: N01N01

我要问的是单行迭代器将所有"1"替换为"N"而所有"N"替换为"1".

Psh*_*emo 5

由于Java 9 Matcher类包含replaceAll?(Function<MatchResult,String> replacer)可以动态指定的内容,因此应根据当前匹配将其用作替换.所以你的代码可能如下所示:

Map<String, String> replacementsMap = Map.ofEntries(
        Map.entry("1", "N"),
        Map.entry("N", "1")
);

String input = "10N10N";
Pattern p = Pattern.compile("1|N");
Matcher m = p.matcher(input);
String replaced = m.replaceAll(match -> replacementsMap.get(match.group()));
System.out.println(replaced);
Run Code Online (Sandbox Code Playgroud)

输出:N01N01.


在Java 9之前,您可以使用Matcher#appendReplacementMatcher#appendTail而不是replaceAll喜欢

//create Pattern p, Matcher m and replacement map
StringBuffer sb = new StringBuffer();
while(m.find()){
    m.appendReplacement(sb, replacementsMap.get(m.group()));
}
m.appendTail(sb);
String replaced = sb.toString();
Run Code Online (Sandbox Code Playgroud)

如果您愿意使用外部库,那么Apache Commons - Lang包含StringUtils类和replaceEach(String text, String[] searchList, String[] replacementList)方法.您可以像以下一样使用它:

String input = "10N10N";
String replaced = StringUtils.replaceEach(input, new String[] {"1","N"}, new String[] {"N","1"});
System.out.println(replaced);//N01N01
Run Code Online (Sandbox Code Playgroud)