簡體   English   中英

如何替換多個匹配的正則表達式

[英]how to replace multiple matched Regex

我有一組需要應用於一組String的正則表達式替換,

例如:

  1. 具有單個空格的所有多個空格("\\s{2,}" --> " ")
  2. 所有。 然后是一個char。 后跟空格后跟char (\\.([a-zA-Z]-->". $1")

所以我會有這樣的事情:

String s="hello     .how are you?";
s=s.replaceAll("\\s{2,}"," ");
s=s.replaceAll("\\.([a-zA-Z])",". $1");
....

但是想象一下,我想在長字符串上替換100多個這樣的表達式。 不用說這可能有多慢。

所以我的問題是,是否有更有效的方法來使用單個replaceAll(或類似的東西,例如Pattern / Matcher)來推廣這些替換

我跟着Java替換了多個不同的...

但問題是我的正則表達式不是simple Strings

你有這兩個replaceAll調用:

s = s.replaceAll("\\s{2,}"," ");
s = s.replaceAll("\\.([a-zA-Z])",". $1");

您可以將它們組合成單個replaceAll如下所示:

s = s.replaceAll("\\s{2,}|(\\.)(?=[a-zA-Z])", "$1 ");

RegEx演示

查看一次替換多個子字符串並進行修改。

使用Map<Integer, Function<Matcher, String>>

  • 組號為整數鍵
  • Lambdas作為價值觀

修改循環以檢查匹配的組。 然后使用該組號獲取替換lambda。

偽代碼

Map<Integer, Function<Matcher, String>> replacements = new HashMap<>() {{
    put(1, matcher -> "");
    put(2, matcher -> " " + matcher.group(2));
}};

String input = "lorem substr1 ipsum substr2 dolor substr3 amet";

// create the pattern joining the keys with '|'. Need to add groups for referencing later
String regexp = "(\\s{2,})|(\\.(?:[a-zA-Z]))";

StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile(regexp);
Matcher m = p.matcher(input);

while (m.find()) {
    //TODO change to find which groupNum matched
    m.appendReplacement(sb, replacements.get(m.group(groupNum)));
}
m.appendTail(sb);


System.out.println(sb.toString());   // lorem repl1 ipsum repl2 dolor repl3 amet

暫無
暫無

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

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