2013-11-02 71 views
10

我在尋找一個非常簡單的獲得與下面的JavaScript代碼類似的方法。也就是說,對於每個匹配,我想調用某個轉換函數並將結果用作重置值。在Java 7中,Regex-replace-with-function-evaluation等價於什麼?

var res = "Hello World!".replace(/\S+/, function (word) { 
    // Since this function represents a transformation, 
    // replacing literal strings (as with replaceAll) are not a viable solution. 
    return "" + word.length; 
}) 
// res => "5 6" 

Only .. in Java。而且,最好作爲可以重複使用的「單一方法」或「模板」。

回答

10

你的答案在Matcher#appendReplacement文檔中。把你的函數調用放在while循環中。

[appendReplacement方法]旨在與appendTail和find方法一起用於循環中。下面的代碼,例如,在院子裏寫道:一隻狗兩條狗到標準輸出流:

Pattern p = Pattern.compile("cat"); 
Matcher m = p.matcher("one cat two cats in the yard"); 
StringBuffer sb = new StringBuffer(); 
while (m.find()) { 
    m.appendReplacement(sb, "dog"); 
} 
m.appendTail(sb); 
System.out.println(sb.toString()); 
+2

[這裏](http://stackoverflow.com/a/1282099/20938)是一個更完整的解決方案。它處理美元符號和反斜槓被'appendReplacement()'視爲特殊的問題。 –

0

不知道您的精確要求,但像這可能是工作內容:

String res = ""; 
for (String piece : "hello world".split(" ")) 
    res += Integer.toString(piece.length()) + " "; 

當然,還有其他方法可以編寫,並根據需要進行調整(例如,使用比空格更精確的分隔符)。

要精確實施您的代碼段,您可以使用例如StreamTokenizerStringReader和一些包裝解析出分隔符並將它們插入計數之間。

+1

雖然這可以在這裏工作,但我正在尋找一種可以保持通用的解決方案(通過使用正則表達式支持)。 – user2864740

+0

啊,是的,這樣做並不是一個好方法。 –

6

當允許的Java 8,你可以使用LAMBDA表達式,有一個JavaScript喜歡更換:

String result = StringReplacer.replace("Hello World!", Pattern.compile("\\S+"), (Matcher m) -> { 
    return "" + m.group().length(); 
}); 

StringReplacer.java:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class StringReplacer { 
    public static String replace(String input, Pattern regex, StringReplacerCallback callback) { 
     StringBuffer resultString = new StringBuffer(); 
     Matcher regexMatcher = regex.matcher(input); 
     while (regexMatcher.find()) { 
      regexMatcher.appendReplacement(resultString, callback.replace(regexMatcher)); 
     } 
     regexMatcher.appendTail(resultString); 

     return resultString.toString(); 
    } 
} 

StringReplacerCallback.java:

import java.util.regex.Matcher; 

public interface StringReplacerCallback { 
    public String replace(Matcher match); 
} 

來源:http://www.whitebyte.info/programming/string-replace-with-callback-in-java-like-in-javascript

+3

您可能希望在替換字符串上調用'Matcher.quoteReplacement',以避免特殊處理斜槓和美元符號。 – Gareth

+0

@Gareth如果你可以將[gist](https://gist.github.com/nickrussler/42f8619f1a36eea25364)分叉,改進它並用鏈接評論回來,那將是非常棒的。然後我會盡快更新這篇文章和我的主旨。 –

相關問題