Java 忽略句点,但在单词末尾打印句点

Java 忽略句点,但在单词末尾打印句点,java,Java,我的代码正确地翻译了常规单词(“附近”到“侧面”) 但是,它无法将带点的单词(“附近”翻译为“附近”。但应该翻译为“侧面”)我不确定代码为什么要这样做,但一旦它“检测”到句点,它就无法翻译我的翻译表。这是我的代码: String token = scan.nextLine(); String[] output = token.split("\\s+"); for (int i = 0; i < output.length; i++) {

我的代码正确地翻译了常规单词(“附近”到“侧面”) 但是,它无法将带点的单词(“附近”翻译为“附近”。但应该翻译为“侧面”)我不确定代码为什么要这样做,但一旦它“检测”到句点,它就无法翻译我的翻译表。这是我的代码:

 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(" ");
            }
String-token=scan.nextLine();
字符串[]输出=token.split(\\s+);
for(int i=0;i

我尝试了几种方法(replaceAll()、split()),但都没有成功。

添加此行以删除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
更新的解决方案,以保留转换后的句点:(使用临时字符串,而不是替换标记的值)

for(int i=0;i
使用此正则表达式而不是您的正则表达式:

(\s+|\.+)+
它不仅会在空格上拆分令牌,还会在句点上拆分令牌。这样,空格和句点都会从输出比较中排除

正则表达式的基本意思是:一个或多个空格或一个或多个点,即使它们在一行中出现多次。因此,这种模式也适用于“wordA…wordB”之类的字符串


顺便说一句:您可以在上测试模式。只需将其复制到regex字段并在下面的字段中输入一些测试字符串。您可以看到,您的代码将在其中拆分句子。

您这里的问题是正则表达式
(\\s+)
是在空格上拆分的;因此以下标记是独立的和不同的标记

  • 附近
  • 附近
就这一点而言,这些也是:

  • 附近
  • 附近
  • 1234附近
  • 近在咫尺
当您在替换映射中检查该值时,一个被找到,另一个没有。如果希望在映射中找到确切的键、值对(附近->侧面),则在检查之前,您必须修改代码以去除标点/数字字符等。(继续向您的输入中添加类似nearby7的内容,您应该会发现给定的当前代码也没有正确替换)

需要理解的关键概念包括:

  • 您的正则表达式在标记化方面做了什么
  • 地图中的字符串键如何精确匹配

  • 不要使用提供的方便的正则表达式方法。它们的功能还不够。通过使用和直接、具体地和利用正则表达式API:

    import java.util.*;
    导入java.util.regex.*;
    公共类字替换器{
    公共静态void main(字符串…参数){
    String start=“我在附近,非常近。”;
    映射转换=新的HashMap();
    翻译。放置(“附近”、“侧面”);
    Pattern=Pattern.compile(\\w+);
    Matcher Matcher=pattern.Matcher(开始);
    StringBuffer sb=新的StringBuffer();
    while(matcher.find()){
    String group=matcher.group();
    matcher.appendReplacement(sb,matcher.quoteReplacement(translation.getOrDefault(group,group));
    }
    (某人);
    系统输出打印LN(sb);
    }
    }
    
    预定义的字符类
    \w
    与字符
    [a-zA-Z_0-9]
    匹配。如果这不符合您的需要,您只需滚动您自己的正则表达式即可

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


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

    我将假设hashmap包含键“nearest”。但是,正则表达式将创建“nearest”的输出[I]。(带句点)。因此,查找将失败。调整正则表达式。您好,Bajal,我不想删除句点,但要将其与单词“分离”,以便代码正确地翻译单词。因此,您希望将句点或空格视为用户输入的定界符?例如,“nearest.nearest something”if“broadside”的预期输出是什么是“nearest”的翻译,那么“nearest”的期望输出将是“broadside”。但在本例中,代码将“nearest.”翻译为“nearest”你是对的。谢谢。但是翻译后缺少句点。我该如何实现它?我完全知道你的意思。但我真的不知道该怎么做。我尝试了很多方法。它们都不起作用。如果我使用子字符串呢?你需要确保你在地图中查找的键是完全相同的,但你不想修改它它是原始的标记。因此您可以执行hashmap.containsKey(output[i].replaceAll(\\p{Punct},“”)之类的操作,该操作将匹配映射中的键。然后您需要拉出替换项:String replacement=hashmap.get(output[i].replaceAll(\\p{Punct},“”);然后您需要在输出中实际交换替换项:output[i]=ou
    (\s+|\.+)+
    
    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);
        }
    }