【问题标题】:Searching a string for a specified word [duplicate]在字符串中搜索指定的单词[重复]
【发布时间】:2014-02-07 22:15:54
【问题描述】:

我想检查输入的特定单词是否在字符串中。我使用了以下代码:

import java.util.*;
import java.io.*;

public class StringTest {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        String s1;
        s1 = s.next();
        String s2 = "this is an accomplishment";
        if (s2.contains(s1)) {
            System.out.println("you have done it");

        } else
            System.out.println("try another word");
    }
}

如果我输入单词“com”,我会得到结果

你已经做到了

但“com”实际上只是“成就”一词的一部分。我希望这种情况下的结果是

换个词

因为s2 不包含完整的单词“com”。我也试过indexOf(),但这也给出了相同的结果。我应该怎么做?

【问题讨论】:

    标签: java string contains


    【解决方案1】:

    最好的正则表达式方法可能是

    Pattern p = Pattern.compile("\\b" + Pattern.quote(s1) + "\\b");
    if (p.matcher(s2).find()) { ... }
    

    它处理单词边界和转义。请注意,编译 Pattern 不是免费的。

    【讨论】:

      【解决方案2】:

      Read up on the API for String.

      特别注意 contains() 的作用。如果序列存在于字符串中,则匹配。它无法区分该字符串中的单独单词。只要 'com' 出现在该字符串中的任何位置, contains() 就会返回 true。您希望它只匹配整个单词,而 contains() 不匹配。

      如果给定的字符串出现在空格或标点符号周围,您可以使用正则表达式进行匹配。试试Regular Expressions 上的 Java 教程。

      或者,更简单地说,您可以将字符串沿空格分开。 String 方法 split() 或其他 Scanner 可以轻松做到这一点。这将为您提供单个单词,被 Scanner 类称为“令牌”,作为 String 类的实例。之后,使用 equals() 代替 contains()。正则表达式也可以做到这一点,但一开始学习它们会更费力(但完全值得)。

      【讨论】:

        【解决方案3】:

        使用以下代码代替if(s2.contains(s1))

        if(Pattern.compile("\\b" + s1 + "\\b").matcher(s2).find())
        

        请务必import java.util.regex.Pattern;

        它将在s2 中搜索与s1 匹配的整个单词。有关详细信息,请参阅以下页面:

        或者,您可以使用

        if(s2.matches(".*\\b" + s1 + "\\b.*"))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-27
          • 1970-01-01
          • 1970-01-01
          • 2016-04-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多