【问题标题】:How to find the exact word using a regex in Java?如何在 Java 中使用正则表达式找到确切的单词?
【发布时间】:2012-02-27 11:28:38
【问题描述】:

考虑以下代码sn-p:

String input = "Print this";
System.out.println(input.matches("\\bthis\\b"));

输出

false

这种方法可能有什么问题?如果它是错误的,那么找到确切单词匹配的正确解决方案是什么?

PS:我在这里找到了许多类似的问题,但没有一个提供我正在寻找的解决方案。 提前致谢。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    当您使用matches() 方法时,它会尝试匹配整个输入。在您的示例中,输入 "Print this" 与模式不匹配,因为单词 "Print" 不匹配。

    所以你需要在正则表达式中添加一些东西来匹配字符串的初始部分,例如

    .*\\bthis\\b
    

    如果你也想在行尾允许额外的文本:

    .*\\bthis\\b.*
    

    或者,使用Matcher 对象并使用Matcher.find() 在输入字符串中查找匹配

        Pattern p = Pattern.compile("\\bthis\\b");
        Matcher m = p.matcher("Print this");
        m.find();
        System.out.println(m.group());
    

    输出:

    this
    

    如果要在一行中查找多个匹配项,可以反复调用find()group() 将它们全部提取出来。

    【讨论】:

      【解决方案2】:

      匹配器的完整示例方法:

      public static String REGEX_FIND_WORD="(?i).*?\\b%s\\b.*?";
      
      public static boolean containsWord(String text, String word) {
          String regex=String.format(REGEX_FIND_WORD, Pattern.quote(word));
          return text.matches(regex);
      }
      

      解释:

      1. (?i) - 忽略大小写
      2. .*? - 允许(可选)之前的任何字符
      3. \b - 单词边界
      4. %s - 要由 String.format 更改的变量(引用以避免正则表达式 错误)
      5. \b - 单词边界
      6. .*? - 允许(可选)在
      7. 之后的任何字符

      【讨论】:

      • .* 已经是任何字符零次或多次,因此您不需要?
      【解决方案3】:

      有关详细说明,请参阅:http://www.regular-expressions.info/java.html

      myString.matches("regex") 返回 true 或 false,具体取决于 字符串可以完全由正则表达式匹配。这是 重要的是要记住 String.matches() 只有在 可以匹配整个字符串。换句话说:“正则表达式”的应用就像 你用字符串锚的开头和结尾写了“^regex$”。这个 与大多数其他正则表达式库不同,其中“快速匹配 如果正则表达式可以匹配到 细绳。如果 myString 是 abc,则 myString.matches("bc") 返回 false。 bc 与 abc 匹配,但 ^bc$(此处实际使用)不匹配。

      这写的是“真”:

      String input = "Print this";
      System.out.println(input.matches(".*\\bthis\\b"));
      

      【讨论】:

        【解决方案4】:

        您可以使用组来查找确切的单词。 Regex API 通过括号指定组。例如:

        A(B(C))D

        该语句由三组组成,从 0 开始索引。

        • 第 0 组 - ABCD
        • 第一组 - BC
        • 第二组 - C

        所以如果你需要查找某个特定的词,你可以使用Matcher类中的两种方法如:find()查找正则表达式指定的语句,然后得到一个String由其组号指定的对象:

        String statement = "Hello, my beautiful world";
        Pattern pattern = Pattern.compile("Hello, my (\\w+).*");
        Matcher m = pattern.matcher(statement);
        m.find();
        System.out.println(m.group(1));
        

        上面的代码结果会“漂亮”

        【讨论】:

        • find() 返回一个布尔值,指示匹配是否成功。您应该永远致电find() 并忽略结果。 matches()lookingAt() 同上。此外,组编号从一开始索引,而不是从零开始。第一个“组”group(0) 是代表整个比赛的人工组。
        【解决方案5】:

        你的searchString 会是正则表达式吗?如果不是简单地使用String.contains(CharSequence s)

        【讨论】:

        • 请注意,当您将"this" 传递给contains 方法时,如果输入字符串是不带空格的"isthisnice",它也会返回true。所以你不知道,如果匹配是确切的词。
        【解决方案6】:

        System.out.println(input.matches(".*\\bthis$"));

        也有效。这里 .* 匹配空格之前的任何内容,然后匹配到最后的单词。

        【讨论】:

          猜你喜欢
          • 2017-06-27
          • 1970-01-01
          • 1970-01-01
          • 2017-12-23
          • 1970-01-01
          • 1970-01-01
          • 2016-12-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多