2014-01-13 33 views
5

我正在嘗試取一個字符串,然後返回一個字符串,數字1到10替換爲這些數字的字。例如:用名稱替換小數點1到10(「1」,「2」..)

我贏了10場比賽中的7場並獲得30美元。

應該變成:

我贏得的遊戲並獲得30美元。

所以我這樣做:

import org.apache.commons.lang3.StringUtils; 

String[] numbers = new String[] {"1", "2", "3","4","5","6","7","8","9","10"}; 
String[] words = new String[]{"one", "two", "three","four","five","six", 
    "seven","eight","nine","ten"}; 
System.out.print(StringUtils.replaceEach(phrase, numbers, words)); 

,結果是這樣的:

我贏得了比賽one0七收到three0美元。

所以我嘗試了蠻力的方式,我相信可以用正則表達式或更優雅的字符串操作加以改進:

public class StringReplace { 

    public static void main(String[] args) { 
    String phrase = "I won 7 of the 10 games and received 30 dollars."; 
    String[] sentenceWords = phrase.split(" "); 
    StringBuilder sb = new StringBuilder(); 
    for (String s: sentenceWords) { 
     if (isNumeric(s)) { 
     sb.append(switchOutText(s)); 
     } 

     else { 
     sb.append(s); 
     } 
     sb.append(" "); 

    } 
    System.out.print(sb.toString()); 
    } 

    public static String switchOutText(String s) { 
    if (s.equals("1")) 
     return "one"; 
    else if (s.equals("2")) 
     return "two"; 
    else if (s.equals("3")) 
     return "three"; 
    else if (s.equals("4")) 
     return "four"; 
    else if (s.equals("5")) 
     return "fivee"; 
    else if (s.equals("6")) 
     return "six"; 
    else if (s.equals("7")) 
     return "seven"; 
    else if (s.equals("8")) 
     return "eight"; 
    else if (s.equals("9")) 
     return "nine";   
    else if (s.equals("10")) 
     return "ten"; 
    else 
     return s;   
    } 

    public static boolean isNumeric(String s) { 
    try { 
     int i = Integer.parseInt(s); 
    } 
    catch(NumberFormatException nfe) { 
     return false; 
    } 
    return true; 
    } 

} 

是不是有更好的辦法?特別感興趣的正則表達式的建議。

+2

這似乎是一個非常簡單的調用String.replaceAll()就足夠了。只要確保從10開始,以避免「one0」的問題。 –

+0

您可以嘗試將'10'移動到數組的前面,以便在'1'前面進行評估。但可能會有一個更合適的變化。 – crush

+3

@KevinWorkman的OP也需要處理避免「30」中的「3」獲得「三」所取代。 – GriffeyDog

回答

10

這種方法使用正則表達式匹配非數字環繞目標位(或開始或結束字符):

String[] words = { "one", "two", "three", "four", "five", "six", "seven", 
    "eight", "nine", "ten" }; 
String phrase = "I won 7 of the 10 games and received 30 dollars."; 

for (int i = 1; i <= 10; i++) { 
    String pattern = "(^|\\D)" + i + "(\\D|$)"; 
    phrase = phrase.replaceAll(pattern, "$1" + words[i - 1] + "$2"); 
} 

System.out.println(phrase); 

此打印:

我贏了七十遊戲並獲得30美元。

它還應付如果數字是句子中的第一個或最後一個單詞。例如:

9貓開啓100人打死了10

正確地轉換到

九尾貓開啓100人,殺死10

+0

它是否涵蓋這種情況:我最喜歡的數字是7,但我也喜歡5. – BobbyD17

+0

@ BobbyD17快速測試表明是的。是什麼讓你懷疑它可能不會? –

+0

這是我的回答下長大的一個評論。我只是確保你檢查了它。我從來沒有像你那樣使用過這種模式,我不太確定它是如何工作的。 – BobbyD17

1

在用單詞替換任何數字之前,您需要檢查該號碼未被跟隨或被另一個號碼所覆蓋。這可能是確保它不屬於更大數量的唯一方法。所以你不會用「three0」替代「30」等等。這將允許它是「30」或「30」。或「30」或任何其他標點符號。所以,支票必須確保它不是0-9。

+1

您還需要處理該號碼後跟一個句點,而不是空白的情況。 – GriffeyDog

+0

好點。也許你將不得不首先檢查每個短語後面沒有數字。所以在你更換任何東西之前,請確保下一個字符不是數字。將此添加爲編輯。 – BobbyD17

+0

對於HTML,這可能會工作,因爲空間已摺疊。在其他情況下,這是一個糟糕的解決方案。 –

相關問題