我的代码正确翻译常规字词("附近"到#34;宽边") 然而,它通过用点翻译单词("附近。"到#34;附近。"但应该被翻译为" broadside)而失败。我不知道为什么代码这样做,但一旦它"检测到"期间,它无法翻译我的翻译表。这是我的代码:
String token = scan.nextLine();
String[] output = token.split("\\s+");
for (int i = 0; i < output.length; i++)
{
if (hashmap.containsKey(output[i]))
{
output[i] = hashmap.get(output[i]);
}
System.out.print(output[i]);
if (i != output.length - 1)
{
System.out.print(" ");
}
我尝试了几种方法(replaceAll(),split())但没有成功。
答案 0 :(得分:1)
添加此行以删除for循环中的句点(或您要忽略的任何其他字符)。
for (int i = 0; i < output.length; i++) {
output[i] = output[i].replaceAll("\\.", ""); //Add this line (or use a new variable)
if (hashmap.containsKey( output[i]) ) {
output[i] = hashmap.get(output[i]);
}
System.out.print(output[i]);
if (i != output.length - 1) {
System.out.print(" ");
}
}
更新解决方案,以保留翻译后的句点:(使用临时字符串而不是替换标记的值)
for (int i = 0; i < output.length; i++) {
String tempStr = output[i].replaceAll("\\.", "");
if (hashmap.containsKey( tempStr ) ) {
output[i] = hashmap.get(tempStr);
}
System.out.print(output[i]);
if (i != output.length - 1) {
System.out.print(" ");
}
}
答案 1 :(得分:0)
使用此正则表达式而不是您的:
(\s+|\.+)+
它不仅会在空格上分割令牌,还会在句点上分割。像这样,空格和句点都会从输出比较中排除。
正则表达式基本上意味着:一个或多个空格或一个或多个点,即使它们连续出现多次。因此,这种模式也适用于像“wordA ... wordB”这样的字符串。
顺便说一下:你可以在http://www.regexpal.com/上测试模式。只需将其复制到正则表达式字段,然后在下面的字段中输入一些测试字符串。就像你可以看到的那样,代码会将句子分开。
答案 2 :(得分:0)
你的问题是你的正则表达式(\\s+)
在空格上分裂;因此,以下令牌是分开的&amp;不同的令牌
就此而言,这些也是如此:
当您在替换地图中检查该值时,会找到一个,而另一个则不会。如果您希望找到确切的密钥,值对(附近 - &gt;宽边),则必须修改代码以删除标点符号/数字字符等,然后才能在地图中检查它。 (继续在你的输入中加上像附近7这样的东西,你应该找到你当前的代码,这也没有被正确替换)。
要理解的关键概念是:
答案 3 :(得分:0)
请勿使用String
提供的便捷正则表达式方法。他们没有足够的能力。直接使用Pattern
和Matcher
,特别是Matcher.appendReplacement
和Matcher.appendTail
来充分利用正则表达式API:
import java.util.*;
import java.util.regex.*;
public class WordReplacer {
public static void main(String... args) {
String start = "I am nearby, very nearby.";
Map<String, String> translation = new HashMap<>();
translation.put("nearby", "broadside");
Pattern pattern = Pattern.compile("\\w+");
Matcher matcher = pattern.matcher(start);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String group = matcher.group();
matcher.appendReplacement(sb, Matcher.quoteReplacement(translation.getOrDefault(group, group)));
}
matcher.appendTail(sb);
System.out.println(sb);
}
}
预定义字符类\w
与字符[a-zA-Z_0-9]
匹配。如果这不符合您的需求,您可以简单地将自己的正则表达式用于单词。
现在你不需要关心空格和标点符号。
另一个潜在的问题是区分大小写和保存。但这似乎超出了范围。