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

replace substrings in string using regex groups

我找不到正确的方法来删除等于 "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() 只执行一次。

return dataStr.replaceAll("(?smi)\bnull\b", "");
  • \b是字界。
  • (?i) 是一条 i=忽略大小写的命令。
  • (?s) 是 DOT_ALL,. 也匹配换行符。)
  • (?m) 是 MULTI_LINE.

你忘记了appendTail,for all after the last replacement. 如果字符串包含多行,则添加 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 是由 replaceAll 提供的自由命名的 MatchResult

你可能要替换什么 null 只要它后面跟一些字符,比如:

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

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

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

(?1) 表示 "ignore case"。 \b 表示 "word boundary"。嵌入的换行符无关紧要。