使用正则表达式组替换字符串中的子字符串
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"。嵌入的换行符无关紧要。
我找不到正确的方法来删除等于 "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
.
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"。嵌入的换行符无关紧要。