在一个非常简单的问题上,我的行为很奇怪。
我有一个包含很多空字符串的字符串:
“ 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。但是我不明白为什么会这样吗?
答案 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();
}