Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用正则表达式查找确切的单词?_Java_Regex - Fatal编程技术网

如何在Java中使用正则表达式查找确切的单词?

如何在Java中使用正则表达式查找确切的单词?,java,regex,Java,Regex,考虑以下代码段: String input = "Print this"; System.out.println(input.matches("\\bthis\\b")); 输出 false 这种方法可能有什么问题?如果它是错误的,那么找到确切的单词匹配的正确解决方案是什么 PS:我在这里发现了很多类似的问题,但没有一个能提供我想要的解决方案。 提前感谢。当您使用matches()方法时,它会尝试匹配整个输入。在您的示例中,输入“Print this”与模式不匹配,因为单词“Print”不匹

考虑以下代码段:

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

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

PS:我在这里发现了很多类似的问题,但没有一个能提供我想要的解决方案。
提前感谢。

当您使用
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()
,将它们全部提取出来。

有关详细说明,请参阅:

matches(“regex”)根据 字符串可以完全由正则表达式匹配。它是 重要的是要记住,String.matches()仅在 可以匹配整个字符串。换句话说,“regex”的应用就好像 您已经编写了带有字符串开头和结尾锚点的“^regex$”。这 与大多数其他正则表达式库不同,在其他正则表达式库中 如果正则表达式可以在数据库中的任何位置匹配,则“test”方法返回true 一串如果myString是abc,那么myString.matches(“bc”)返回false。 bc与abc匹配,但^bc$(此处实际使用)不匹配

这写着“真”:


您可以使用组来查找确切的单词。正则表达式API用括号指定组。例如:

A(B(C))D

此语句由三个组组成,它们从0索引

  • 第0组-ABCD
  • 第一组-卑诗省
  • 第二组-C
因此,如果您需要查找某些特定的单词,可以在
Matcher
类中使用两种方法,例如:
find()
来查找由正则表达式指定的语句,然后获取由其组号指定的
字符串
对象:

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

上面的代码结果将是“漂亮的”

您的
搜索字符串将是正则表达式吗?如果不是简单地使用matcher的完整示例方法:

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);
}
说明:

  • (?i)-忽略案例
  • *?-允许(可选)在
  • \b-单词边界
  • %s-通过String.format更改的变量(引用以避免正则表达式 错误)
  • \b-单词边界
  • *?-允许(可选)后面的任何字符
  • System.out.println(input.matches(“.*\\b此$”)


    同样有效。此处,.*匹配空格前的任何内容,然后将其匹配为结尾的单词。

    find()
    返回一个布尔值,指示匹配是否成功。永远不要调用
    find()
    并忽略结果。
    matches()
    lookingAt()
    也一样。此外,组号从1开始编制索引,而不是从零开始编制索引。第一个“组”,即
    group(0)
    ,是一个代表整个匹配的人工组。请注意,当您将
    “this”
    传递给
    contains
    方法时,如果输入字符串是
    “isthisnice”
    ,且不带空格,则它也会返回true。因此,您不知道匹配是否为精确的单词。
    *
    已经是任何字符的零次或多次,因此您不需要
    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);
    }