Java-如何解析字符串中特定单词的单词

4

如何在句子“hi,how are you?”中解析单词“hi”或在“how are you?”中解析单词“how”?

以下是所需代码示例:

String word = "hi";
String word2 = "how";
Scanner scan = new Scanner(System.in).useDelimiter("\n");
String s = scan.nextLine();
if(s.equals(word)) {
System.out.println("Hey");
}
if(s.equals(word2)) {
System.out.println("Hey");
}

你注意到当前版本存在什么问题了吗? - Mark Byers
两个问题:您在测试字符串相等性时没有考虑到一行中可能包含空格、逗号、感叹号等,也没有考虑大小写。请参阅下面的答案。 - p.marino
5个回答

7

哇!那正是我正在寻找的!顺便说一下:在我的实际版本中,我已经将它转换为小写了,我只是为了这个问题而简化了它!再次感谢! - Jackson Curtis

5
看起来需要使用正则表达式。如果使用“包含”(Contains)函数,会在例如“分期付款”(hire-purchase)的情况下出现误报。请参考Java正则表达式文档
if (Pattern.match("\\bhi\\b", stringToMatch)) { //...

一个没有解释的恶意点踩?你是真的想要改善 Stack Overflow,还是只是为了伤害别人而放弃自己的声望? - Anon.
抱歉,没看到这里已经有其他答案了 :p我尝试过了,但好像完全没有用...我可能做错了什么?顺便说一下,当我使用“match”时,它会给我一个错误,所以我使用“matches”。 - Jackson Curtis
+1 除非你将 \\b 双重转义,否则它无法正常工作。正在更新答案。 - Amir Raminfar

3
我会选择使用java.util.StringTokenizer来进行翻译:https://docs.oracle.com/javase/1.5.0/docs/api/java/util/StringTokenizer.html
StringTokenizer st = new StringTokenizer(
    "Hi, how are you?", 
    ",.:?! \t\n\r"       //whitespace and puntuation as delimiters
);
 while (st.hasMoreTokens()) {
     if(st.nextToken().equals("Hi")){
         //matches "Hi"
     }
 }

或者,您可以查看 java.util.regex 并使用正则表达式。


StringTokenizer 的 javadoc 包含以下句子: "StringTokenizer 是一个遗留类,为了兼容性而保留,尽管在新代码中不建议使用。建议任何寻求此功能的人改用 String 的 split 方法或 java.util.regex 包。" - Simon Nickerson
Simon Nickerson:谢谢你指出这一点,我之前没有意识到。可惜他们更喜欢使用split,因为它似乎会提前完成所有工作。 - Roland Bouman
如果用户只输入了“hi”,后面就没有了空格,会发生什么? - Jackson Curtis
@Custard:你试过了吗?对我来说,字符串分词器在nextToken()上正确地传递了“hi”。 - Roland Bouman
我还没有(抱歉),但我很感兴趣!我明天会处理它! - Jackson Curtis

0

我会选择分词器

设置空格和其他元素,如逗号、句号等作为分隔符。并且记得在不区分大小写的模式下进行比较。

这样,您就可以在“嗨,他的测试怎么样”中找到“hi”,而不会在“his”上得到错误的结果,并且在以大写字母H开头的“Hi”上得到错误的结果。


0

你可以将一个正则表达式传递给Scannernext()方法。这样,你就可以遍历输入中的每个单词(Scanner默认按空格分隔),并在匹配时执行相应的处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接