忽略句号,但在单词结尾处打印期间

时间:2016-04-02 01:26:07

标签: java

我的代码正确翻译常规字词("附近"到#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())但没有成功。

4 个答案:

答案 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;不同的令牌

  • 附近
  • 附近。

就此而言,这些也是如此:

  • 附近!
  • 附近?
  • nearby1234
  • nearbyWithWordsSmashedTogether

当您在替换地图中检查该值时,会找到一个,而另一个则不会。如果您希望找到确切的密钥,值对(附近 - &gt;宽边),则必须修改代码以删除标点符号/数字字符等,然后才能在地图中检查它。 (继续在你的输入中加上像附近7这样的东西,你应该找到你当前的代码,这也没有被正确替换)。

要理解的关键概念是:

  1. 你的正则表达式在标记化方面做了什么
  2. 地图中的字符串键必须精确匹配

答案 3 :(得分:0)

请勿使用String提供的便捷正则表达式方法。他们没有足够的能力。直接使用PatternMatcher,特别是Matcher.appendReplacementMatcher.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]匹配。如果这不符合您的需求,您可以简单地将自己的正则表达式用于单词。

现在你不需要关心空格和标点符号。

另一个潜在的问题是区分大小写和保存。但这似乎超出了范围。