簡體   English   中英

使用正則表達式組替換字符串中的子字符串

[英]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 = ignore大小寫的命令。
  • (?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));

其中mrreplaceAll提供的自由命名的MatchResult

你可能什么來代替null ,只要它后面是一些字符,如:

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

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

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

(?1)表示“忽略大小寫”。 \\b表示“單詞邊界”。 嵌入式換行符無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM