我试图取一个字符串然后返回一个数字1到10的字符串替换为这些数字的单词。例如:
我赢了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));
结果如下:
我在一场比赛中赢了7场比赛并获得了3美元。
所以我尝试了一种蛮力方式,我确信可以通过正则表达式或更优雅的字符串操作来改进:
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;
}
}
有没有更好的方法?特别感兴趣的是正则表达式的建议。
答案 0 :(得分:11)
此方法使用正则表达式匹配由非数字(或开头或结尾字符)包围的目标数字:
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只,杀了十只
答案 1 :(得分:1)
在用任何单词替换任何数字之前,您需要检查该数字是否未被跟随或以其他数字开头。这可能是确保它不是更大数字的一部分的唯一方法。因此,您不会将“30”替换为“three0”,依此类推。这将使它成为“30”或“30”。或“30”或任何其他标点符号。因此,检查必须确保它不是0-9。