【问题标题】:Java- how to parse for words in a string for a specific wordJava-如何为特定单词解析字符串中的单词
【发布时间】:2011-01-19 10:09:30
【问题描述】:

我将如何解析句子“嗨,你好吗?”中的“嗨”一词 或解析“你好吗?”中的“如何”一词?

我想要的代码示例:

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");
}

【问题讨论】:

  • 您发现当前版本有什么问题?
  • 两个问题:您测试字符串的相等性,而不考虑一行可能包含空格、逗号、感叹号等,也不关心大写/小写。请参阅下面的答案

标签: java string parsing words


【解决方案1】:

我会选择java.util.StringTokenizerhttps://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 是一个遗留类,尽管在新代码中不鼓励使用它,但出于兼容性原因保留它。建议任何寻求此功能的人使用Stringjava.util.regex 包的拆分方法。"
  • Simon Nickerson:感谢您指出这一点,我没有意识到。可惜他们偏爱split,因为这似乎已经完成了所有工作
  • 如果用户只输入“hi”会发生什么?后面没有“ ”了。
  • @Custard:你试过了吗?对我来说,字符串标记器在nextToken() 上正确传递了“hi”
  • 我没有,(对不起),但我很感兴趣!明天我去!
【解决方案2】:

要查找子字符串,您可以使用 containsindexOf 或任何其他变体:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html

if( s.contains( word ) ) {
   // ...
}

if( s.indexOf( word2 ) >=0 ) {
   // ...
}

如果您关心单词边界,那么StringTokenizer 可能是一个不错的方法。

https://docs.oracle.com/javase/1.5.0/docs/api/java/util/StringTokenizer.html

然后您可以对每个单词执行不区分大小写的检查 (equalsIgnoreCase)。

【讨论】:

  • 哇!这正是我要找的!顺便说一句:在我的实际版本中,我已经将它转换为小写,我只是为了这个问题而简化了它!再次感谢!
【解决方案3】:

看起来像是Regular Expressions 的工作。 Contains 会误报,例如 "hire-purchase"

if (Pattern.match("\\bhi\\b", stringToMatch)) { //...

【讨论】:

  • 没有任何解释的一票否决?您是真的想改进 SO,还是只是丢掉自己的代表来试图伤害别人的?
  • 嘿抱歉,没有看到这里有其他答案:p 我试过了,但它似乎根本不起作用......我可能做错了什么?顺便说一句:当我使用“匹配”时它给了我一个错误,所以我使用“匹配”
  • +1 除非您需要双重转义 \\b 才能正常工作。正在更新答案。
【解决方案4】:

您可以将正则表达式传递给Scannernext() 方法。因此,您可以遍历输入中的每个单词(扫描仪默认以空格分隔)并在匹配时执行适当的处​​理。

【讨论】:

    【解决方案5】:

    我会选择tokenizer。 将空格和逗号、句号等其他元素设置为分隔符。并且记得在不区分大小写模式下进行比较。

    这样您就可以在“Hi,他的测试进展如何”中找到“hi”,而不会在“his”上得到假阳性,在“Hi”上得到假阴性(以大写 H 开头)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多