Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想在Java中使用String.replaceAll(regex,regex)而不是(regex,String)_Java_String_Replace - Fatal编程技术网

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

我想在Java中使用String.replaceAll(regex,regex)而不是(regex,String),java,string,replace,Java,String,Replace,例如: input = "10N10N"; input = input.replaceAll("1|N", "N|1"); // syntax not correct 预期输出:N01N01 我要的是一个单行迭代器,它用“N”替换所有“1”,用“1”替换所有“N”。我建议您不要使用正则表达式。相反,为什么不这样做: 将所有1替换为u(或输入字符串中任何不存在的字符),然后将N替换为1,再将u替换为N 这可以通过在一行内进行多次替换轻松完成。尝试使用: input = input.repla

例如:

input = "10N10N";
input = input.replaceAll("1|N", "N|1"); // syntax not correct
预期输出:
N01N01


我要的是一个单行迭代器,它用“N”替换所有“1”,用“1”替换所有“N”。

我建议您不要使用正则表达式。相反,为什么不这样做:

  • 将所有1替换为u(或输入字符串中任何不存在的字符),然后将N替换为1,再将u替换为N
这可以通过在一行内进行多次替换轻松完成。

尝试使用:

input = input.replace("1", "-")//replace all 1 by - 
        .replace("N", "1")     //replace all N by 1
        .replace("-", "N");    //replace all - by N
更安全的解决方案,如果您使用Java 8,您可以使用:

String result = input.chars()
        .map(x -> x == 'N' ? '1' : x == '1' ? 'N' : x)
        .collect(StringBuilder::new,
                StringBuilder::appendCodePoint,
                StringBuilder::append
        ).toString();
输出

N01N01

因为Java9Matcher类包含可以根据当前匹配动态指定应该用作替换的内容。因此,您的代码可能如下所示:

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);

如果您愿意使用外部库,那么将StringUtils类包含在方法中。您可以像这样使用它:

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

Regex通常不是这样工作的:替换模式中的替换是没有意义的。您正在以这种模式写入字符,通常允许的唯一元字符是反向引用,它使您能够引用匹配字符串的部分或完整性。您能解释一下“更安全的解决方案”是什么意思吗?@Joey Grant第一个解决方案需要第三个字符,我使用了
-
,但是如果输入之前可以有连字符呢?例如
10N-10N
在这种情况下,第三个替换也将替换该连字符,但第二个解决方案不需要该第三个字符,它循环遍历所有字符并检查其是否等于N,然后返回1,如果N将其与1一起返回,最后收集所有结果这就是“更安全的解决方案”的含义希望你能理解。谢谢哦,看起来不错!
String input = "10N10N";
String replaced = StringUtils.replaceEach(input, new String[] {"1","N"}, new String[] {"N","1"});
System.out.println(replaced);//N01N01