使用正则表达式组替换字符串中的子字符串

时间:2018-10-08 14:47:55

标签: java regex matcher

我找不到正确的方法来删除不区分大小写等于“ 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()仅执行一次。

3 个答案:

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

其中mrMatchResult提供的自由命名的replaceAll

答案 1 :(得分:0)

您可能要替换null,只要后面跟一些字符即可,例如:

first.replaceAll("(?i)(null)(?=[;$\\\n])", "")

答案 2 :(得分:0)

您不需要任何花哨的东西:

str = str.replaceAll("(?i)\\bnull\\b", "");

(?1)的意思是“忽略大小写”。 \b的意思是“单词边界”。嵌入的换行符无关。