我找不到正确的方法来删除不区分大小写等于“ null”的子字符串,并用一个空字符串替换一个巨大的输入数据字符串,该字符串包含许多行并使用; 作为正确的方式分隔符。
为简单起见,这是我要寻找的示例:
输入字符串
Steve;nuLL;2;null\n
null;nullo;nUll;Marc\n
....
预期产量
Steve;;2;\n
;nullo;;Marc\n
...
代码
Matcher matcher = Pattern.compile("(?i)(^|;)(null)(;|$)").matcher(dataStr);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group(1) + "" + matcher.group(3));
}
return sb.toString();
可以使用正则表达式解决吗?
编辑:
从上面的Java代码中,我只会得到有史以来被替换的第一个匹配项,但不是行和数据流中的每个外观。无论出于何种原因,matcher.find()
仅执行一次。
答案 0 :(得分:0)
return dataStr.replaceAll("(?smi)\\bnull\\b", "");
\b
是单词边界。(?i)
是带有大小写忽略的命令。(?s)
是DOT_ALL,.
也是换行符。)(?m)
是MULTI_LINE。您在最后一次替换之后忘记了appendTail
。
如果字符串包含多行,请添加MULTI_LINE选项以重新解释^
和$
。请参见Pattern
的javadoc。
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group(1) + "" + matcher.group(3));
}
matcher.appendTail(sb);
或者用lambda:
String result = matcher.replaceAll(mr -> mr.group(1) + mr.group(3));
其中mr
是MatchResult
提供的自由命名的replaceAll
。
答案 1 :(得分:0)
您可能要替换null
,只要后面跟一些字符即可,例如:
first.replaceAll("(?i)(null)(?=[;$\\\n])", "")
答案 2 :(得分:0)
您不需要任何花哨的东西:
str = str.replaceAll("(?i)\\bnull\\b", "");
(?1)
的意思是“忽略大小写”。 \b
的意思是“单词边界”。嵌入的换行符无关。