簡體   English   中英

如何匹配這種模式? (Java /正則表達式)

[英]How to match this pattern ? (Java/regex)

我需要轉換字符串:

"%s blabla %s"

變成:

"%1$s blabla %2$s"

我的代碼如下:

Pattern pattern = Pattern.compile("%s");
Matcher tokenMatcher = pattern.matcher(value);
int index = 1;
while(tokenMatcher.find()){
    String replacement = "%"+String.valueOf(index++)+"\\$s";        
    value = tokenMatcher.replaceFirst(replacement);
    System.out.println(value);
}

問題是程序陷入無限循環,我不明白為什么。 %1$s某種方式與%s相匹配

%1$s blabla %s
%2$s blabla %s
%3$s blabla %s
%4$s blabla %s
%5$s blabla %s
%6$s blabla %s
%7$s blabla %s
%8$s blabla %s
%9$s blabla %s
%10$s blabla %s
etc...

任何想法?

嘗試在循環中重置tokenMatcher

while(tokenMatcher.find()){
    String replacement = "%"+String.valueOf(index++)+"\\$s";        
    value = tokenMatcher.replaceFirst(replacement);
    tokenMatcher = pattern.matcher(value);
}

System.out.println(value);

您必須使用新值重置匹配器:

while (tokenMatcher.find()) {
  String replacement = "%" + String.valueOf(index++) + "\\$s";
  value = tokenMatcher.replaceFirst(replacement);
  tokenMatcher.reset(value); // reset
  System.out.println(value);
}

原因是replaceFirst()將匹配器重置為開頭,但不更改當前匹配的字符串,它仍然包含舊字符串。 您必須自己進行操作以更新匹配器。

while(matcher.find()){
    matcher.appendReplacement(stringBuffer, "%" + String.valueOf(index++) + "\\$s");
}
matcher.appendTail(stringBuffer);

http://tutorials.jenkov.com/java-regex/matcher.html#8

試試下面的代碼

 StringBuilder stringBuilder = new StringBuilder();
        int i = 1;

        for (String s : input.split("%s")) {
            stringBuilder.append(String.format("%s %d", s, "%"+i+++"$"));


       }

String newString = stringBuilder.toString();

暫無
暫無

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

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