2013-02-15 57 views
-1

請問我需要一些人來幫助我解決這個問題,我想用Drive正則表達式代替Dr,Rd和St這樣的字符,請使用正則表達式來解決這個問題。我嘗試了很多方法,但我的結果是正確的。例如,如果用戶提供這個地址給變量v地址: 13,Clinton str off allen rd queens dr。 結果應該是 13,克林頓街關閉艾倫路皇后開車。我自己的正則表達式

這裏是我的代碼示例:

public void standardizeAddress(String vaddress){ 
     address = vaddress;//address is an instance variable 
     String str1,str2; 
     //Replace all instances of 'St,Rd,Dr' with 'Street,Road and Drive' Using 

      String regex = "\\sSt\\s"; 
      Pattern pat = Pattern.compile(regex); 
      Matcher match = pat.matcher(address); 
      while(match.find()) 
      address = match.replaceAll(" Street "); 
      System.out.println(address); 
      str1 = address; 

      regex = "\\sRd\\s"; 
      pat = Pattern.compile(regex); 
      match = pat.matcher(str1); 
      while(match.find()) 
      str1 = match.replaceAll(" Road "); 
      System.out.println(str1); 
      str2 = str1; 

      regex = "\\sDr\\s"; 
      pat = Pattern.compile(regex); 
      match = pat.matcher(str2); 
      while(match.find()) 
      str2 = match.replaceAll(" Drive "); 
      System.out.println(str2);  
     } 

預先感謝您

+0

什麼是輸入?你期望輸出什麼?你會得到什麼輸出? – jlordo 2013-02-15 09:15:59

+1

會使用[String.replace](http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#replace%28java.lang.CharSequence,%20java.lang.CharSequence% 29)或[replaceAll](http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#replaceAll%28java.lang.String,%20java.lang.String%29)還不夠? – acostache 2013-02-15 09:16:16

+1

這麼複雜的代碼適合這麼簡單的工作。改爲使用'yourString.replaceAll(「St」,「Street」)'。 – sp00m 2013-02-15 09:17:58

回答

2

這應該工作:

String str = "Dr abc Rd def St ghi"; 
str = str.replaceAll("(\\s+|^)Dr(\\s+|$)", "$1Drive$2"); 
str = str.replaceAll("(\\s+|^)Rd(\\s+|$)", "$1Road$2"); 
str = str.replaceAll("(\\s+|^)St(\\s+|$)", "$1Street$2"); 

System.out.println(str); 

的產量:

驅動ABC路def Street ghi

此代碼應保留空格以及要替換的單詞之前。

+0

您還需要考慮可能出現在「Dr」或「Rd」之後的任何其他標點符號。當然,這在目前的問題中沒有提到。所以,大概這應該留給OP來操縱正則表達式。否則這一切都很好。 +1 – 2013-02-15 09:23:51

+0

'(\\ s + | ^)Dr(\\ s + | $)'也可以替換爲\\ bDr \\ b'。然後用'Drive'替換。 – 2013-02-15 09:24:51

+0

@RohitJain:雖然我確實同意你的意見,但我對這個問題缺乏背景。如果我有這樣的地址怎麼辦?Foo Barr博士,foo1Dr foo2Rd foo3St。在這種情況下,Dr.'代表醫生。 – npinti 2013-02-15 09:29:52

0

如果你想使用的匹配器下面的代碼示例將幫助你:)

String address = "St number 9 and St number 99 and st number 999";  
String regex = "\\bSt\\b"; 
Pattern pat = Pattern.compile(regex); 
Matcher match = pat.matcher(address); 
address = match.replaceAll("Street"); 
System.out.println(address); 

結果輸出:Street number 9 and Street number 99 and st number 999

0

只是爲了顯示模式和匹配器的用法。我認爲幾個replaceAll的簡單答案是最具可讀性的。

Map<String, String> replacements = new LinkedHashMap<>(); // Keep in order 
    replacements.put("Dr", "Drive"); 
    replacements.put("Rd", "Road"); 
    replacements.put("St", "Street"); 

    StringBuilder regex = new StringBuilder(); 
    for (String abbrev : replacements.keySet()) { 
     regex.append(regex.length() == 0? "\\b(" : "|"); 
     regex.append(Pattern.quote(abbrev)); 
    } 
    regex.append(")\\b"); 
    Pattern abbrevPattern = Pattern.compile(regex.toString()); 
    Matcher m = abbrevPattern.matcher(vaddress); 

    StringBuffer result = new StringBuffer(); 
    while (m.find()) { 
     String outwritten = replacements.get(m.group(1)); 
     m.appendReplacement(result, outwritten); 
    } 
    m.appendTail(result); 
    return result.toString(); 
相關問題