Java替换全部替换功能,每两个替换一次

时间:2018-06-27 15:51:44

标签: java string replaceall

在一个非常简单的问题上,我的行为很奇怪。

我有一个包含很多空字符串的字符串:

  

“ a; b; c; null; null; null; null; null; null; null; null; null; null”

我使用此方法删除了

public String replaceAllNull(String s) {
    s = s.replaceAll(";null;", ";;");

    //if first item = null remove it
    if(s.startsWith("null;")) {
        s = s.substring(4,s.length());
    }

    //if last item = null remove it
    if(s.endsWith(";null")) {
        s = s.substring(0,s.length()-4);
    }
    return s;
}

一切正常,直到我的弦变得更大,我看到了这个奇怪的输出

  

“ a; b; c ;; null ;; null ;; null ;; null ;;”

这只是从两个事件中删除一个。

我想我可以理解,在一个替换程序期间跳过了一个“;”那么我的正则表达式“; null;”无法识别第二个null。但是我不明白为什么会这样吗?

3 个答案:

答案 0 :(得分:3)

您可以通过拆分字符串来使用流

return Stream.of(s.split(";", -1))
             .map(w -> "null".equals(w) ? "" : w)
             .collect(Collectors.joining(";"));

答案 1 :(得分:3)

";null;"的一个实例替换为";;"之后,两个分号都已被处理,因此第二个;不能被视为另一个替换的开始。下次";null;"次出现。直到再次传递“ null”以到达下一个分号之后,才能再次匹配该模式。

您可以使用的模式是不尝试与分号匹配的模式,但必须检查分号是否存在。您可以使用a positive lookbehind and a positive lookahead(在链接页面上查找“ lookahead”和“ lookbehind”)。在这里,正数表示它验证了向后/向前的模式是否存在,但不匹配。

后向正向格式为(?<=X),其中X是在主模式后面查看是否存在的模式。同样,正向查找的格式为(?=X),其中X是要在主要模式之前查看以查看其是否存在的模式。

在这里,我们在比赛之前寻找行{​​{1}}或分号的开头,并在比赛之后寻找行^的结尾或分号。然后,我们只用一个空字符串替换实际匹配$

"null"

答案 2 :(得分:0)

一个非常简单的解决方案,请使用它代替上面的大代码

public String replaceAllNull(String s) {
    return s.replace("null" , "");
}
  

示例

 public static void main(String []args){
    String str = "a;r;c;e;null;d;f;e;null;s;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;s;";
    System.out.println(String.format("Before replacing null %s", str));
    str = replaceAllNull(str);
    System.out.println(String.format("After replacing null %s", str));
}
  

输出

Before replacing null a;r;c;e;null;d;f;e;null;s;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;s;
After replacing null a;r;c;e;;d;f;e;;s;;;;;;;;;;;;;;;;;s;
  

更新,以避免其中包含null的单词,此处为备用

public static String replaceAllNull(String s) {
    String[] arr = s.split(";");
    for (int i = 0; i < arr.length; i++) {
        if (arr[i].equalsIgnoreCase("null"))
            arr[i] = "";
    }
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < arr.length; i++) {
        sb.append(arr[i]);
        if (i < arr.length - 1)
            sb.append(";");
    }
    if (s.endsWith(";"))
        sb.append(";");
    return sb.toString();
}
相关问题