如何在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);
}