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附近
- 近在咫尺
不要使用提供的方便的正则表达式方法。它们的功能还不够。通过使用和直接、具体地和利用正则表达式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);
}
}