我不明白为什么这个正则表达式返回false;
Pattern.matches("\\bi", "an is");
字符i在单词边界!
答案 0 :(得分:14)
在Java中,matches
尝试将模式与整个字符串匹配。
适用于String.matches
,Pattern.matches
和Matcher.matches
。
如果要检查字符串中是否存在匹配项,可以使用.*\bi.*
。在这种情况下,作为Java字符串文字,它是".*\\bi.*"
。
java.util.regex.Matcher
API链接boolean matches()
:尝试将整个区域与模式匹配。 .*
意味着什么如此处所使用的,点.
是一个正则表达式元字符,意味着(几乎)任何字符。 *
是一个正则表达式元字符,意思是“零次或多次重复”。例如,A.*B
匹配A
,后跟零“或更多”“任意”字符,然后是B
(see on rubular.com)。
请注意,.
和*
(以及其他元字符)可能会失去其特殊含义,具体取决于它们出现的位置。 [.*]
是一个匹配文字句点.
或文字星号*
的字符类。在反斜杠之前也会转义元字符,因此a\.b
匹配"a.b"
。
Java没有基于正则表达式的endsWith
,startsWith
和contains
。您仍然可以使用matches
来完成以下相同的操作:
matches(".*pattern.*")
- 它是否包含模式的匹配项?matches("pattern.*")
- 是否以模式的匹配开头?matches(".*pattern")
- 是否以模式的匹配结束?String
API快速备忘单这是一个快速备忘单,列出哪些方法是基于正则表达式的,哪些不是:
答案 1 :(得分:5)
如果您使用匹配项,整个字符串必须匹配:
Pattern.matches(".*\\bi.*", "an is")
这允许前后有0个或更多个字符。或者:
boolean anywhere = Pattern.compile("\\bi").matcher("an is").find();
将告诉您是否有任何子字符串匹配(在这种情况下为true)。作为一个注释,编译正则表达式然后保持它们可以提高性能。
答案 2 :(得分:2)
我不明白为什么Java决定与像Perl这样多年来支持正则表达式的语言相反。我抛弃了标准的Java正则表达式并开始使用我自己的perl风格的regex lib for Java MentaRegex。请参阅下文,如何在Java中使用正则表达式。
方法匹配返回一个布尔值,表示我们是否有正则表达式匹配。
matches("Sergio Oliveira Jr.", "/oliveira/i" ) => true
方法 match 返回一个匹配组的数组。因此,它不仅会告诉您是否匹配,而且还会返回匹配的组,以防您匹配。
match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"]
方法 sub 允许您使用正则表达式执行替换。
sub("aa11bb22", "s/\\d+/00/g" ) => "aa00bb00"
支持全局和不区分大小写的正则表达式。
match("aa11bb22", "/(\\d+)/" ) => ["11"]
match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"]
matches("Sergio Oliveira Jr.", "/oliveira/" ) => false
matches("Sergio Oliveira Jr.", "/oliveira/i" ) => true
允许您更改转义字符,以防您不喜欢看到这么多'\'。
match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"]
match("aa11bb22", "/(#d+)/g", '#' ) => ["11", "22"]