【问题标题】:I want to do String.replaceAll(regex, regex) instead of (regex, String) in Java我想在 Java 中做 String.replaceAll(regex, regex) 而不是 (regex, String)
【发布时间】:2018-07-13 23:29:57
【问题描述】:

例子:

input = "10N10N";
input = input.replaceAll("1|N", "N|1"); // syntax not correct

预期输出:N01N01

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

【问题讨论】:

  • Regex 通常不像那样工作:替换模式中的交替是没有意义的。您正在以该模式编写字符,通常允许的唯一元字符是反向引用,它使您能够引用匹配字符串的部分或完整性。

标签: java string replace


【解决方案1】:

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

  • 将所有 1 替换为 _(或输入字符串中任何不存在的字符),然后将 N 替换为 1,再将 _ 替换为 N。

这可以通过多个替换轻松完成,全部在一行内完成。

【讨论】:

    【解决方案2】:

    尝试使用:

    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
    

    【讨论】:

    • 您能解释一下“更安全的解决方案”是什么意思吗?
    • @Joey Grant 第一个解决方案需要第三个字符,我使用了-,但是如果输入之前可以有连字符怎么办?例如10N-10N 在这种情况下,第三个替换也将替换这个连字符,但第二个解决方案不需要第三个字符,它遍历所有字符并检查它是否等于 N 然后返回 1 如果 N 返回它使用 1 并最终收集所有结果,这就是“更安全的解决方案”的意思,希望你能明白
    • 有道理。谢谢!
    【解决方案3】:

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

    输出:N01N01。


    在 Java 9 之前,您可以使用 Matcher#appendReplacement 和 Matcher#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();
    

    如果您愿意使用外部库,那么 Apache Commons - Lang 包含带有 replaceEach(String text, String[] searchList, String[] replacementList) 方法的 StringUtils 类。你可以像这样使用它:

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

    【讨论】:

    • 哦,看起来不错!
    猜你喜欢
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    相关资源
    最近更新 更多