2010-02-15 73 views
1

我想匹配正則表達式並修改匹配。這是我的功能。現在,我的方法根本不會改變輸入。哪裏不對?謝謝。使用Java Matcher修改組的幫助

Matcher abbrev_matcher = abbrev_p.matcher(buffer); 
    StringBuffer result = new StringBuffer();//must use stringbuffer here! 
    while (abbrev_matcher.find()){ 
     //System.out.println("match found"); 
     abbrev_matcher.appendReplacement(result, getReplacement(abbrev_matcher)); 
    } 
    abbrev_matcher.appendTail(result); 

private static String getReplacement(Matcher aMatcher){ 
    StringBuilder temp = new StringBuilder(aMatcher.group(0)); 
    for (int i = 0; i < temp.length(); i++){ 
     if (temp.charAt(i) == '.'){ 
      temp.deleteCharAt(i); 
     } 

    } 
    return temp.toString(); 
} 
+0

或者如果你知道任何其他方式做動態替換。我找到了這個代碼,但它只使用toLowerCase()字符串方法。即其不可定製。 http://www.javapractices.com/topic/TopicAction.do?Id=80 – user273226 2010-02-15 08:02:49

回答

1

你只是想從匹配的文本中刪除所有的點?在這裏:

StringBuffer result = new StringBuffer(); 
while (abbrev_matcher.find()) { 
    abbrev_matcher.appendReplacement(result, ""); 
    result.append(abbrev_matcher.group().replaceAll("\\.", "")); 
} 
abbrev_matcher.appendTail(result); 

的原因appendReplacement(result, "")是因爲appendReplacement查找$1$2,等等,所以它可以捕捉組替換它們。如果您沒有將字符串文字或其他字符串常量傳遞給該方法,最好避免該處理步驟,而改用StringBuffer的方法。否則,如果替換字符串中有任何美元符號或反斜槓,它將傾向於炸燬。

至於你的getReplacement方法,在我的測試中確實更改了匹配的字符串,但是它沒有正確做到。例如,如果字符串是...blah...,則返回.blah.。這是因爲,每當您在StringBuilder上調用deletecharAt(i)時,都會更改所有後續字符的索引。你必須向後迭代字符串才能使這種方法奏效,但這不值得;只需從開始StringBuilder並建立字符串append - 而不是刪除。它更加高效且易於管理。

現在,我想它更多一些,你看不到任何變化的原因可能是你的代碼拋出的StringIndexOutOfBoundsException,你沒有看到,因爲代碼在try塊運行和相應的catch塊是空的(經典的Empty Catch Block反模式)。 N'est-ce pas?

+0

感謝您的幫助艾倫,但那不是我想要做的。 「點刪除」只是一個例子。我想要做更復雜的動態替換,比如匹配不同形式的日期:「2005年10月10日; 10/10/2005; 10/10/05」並對它們進行規範化。也許這對於這些幫助器方法是不可能的: -/ – user273226 2010-02-15 17:35:21

+0

當然這是可能的,你做這件事的方式恰到好處。您在發佈的代碼中出現了一處不明顯的錯誤。嘗試使用Elliott Hughes的Rewriter類,因此您只需編寫'replacement'方法:http://elliotth.blogspot.com/2004/07/java-implementation-of-rubys-gsub.html – 2010-02-15 19:01:40