方法匹配不好用

时间:2010-07-08 09:16:56

标签: java regex

我不明白为什么这个正则表达式返回false;

Pattern.matches("\\bi", "an is");

字符i在单词边界!

3 个答案:

答案 0 :(得分:14)

在Java中,matches尝试将模式与整个字符串匹配

适用于String.matchesPattern.matchesMatcher.matches

如果要检查字符串中是否存在匹配项,可以使用.*\bi.*。在这种情况下,作为Java字符串文字,它是".*\\bi.*"

java.util.regex.Matcher API链接


.*意味着什么

如此处所使用的,点.是一个正则表达式元字符,意味着(几乎)任何字符。 *是一个正则表达式元字符,意思是“零次或多次重复”。例如,A.*B匹配A,后跟零“或更多”“任意”字符,然后是Bsee on rubular.com)。

参考

相关问题

请注意,.*(以及其他元字符)可能会失去其特殊含义,具体取决于它们出现的位置。 [.*]是一个匹配文字句点.或文字星号*的字符类。在反斜杠之前也会转义元字符,因此a\.b匹配"a.b"


相关问题

Java没有基于正则表达式的endsWithstartsWithcontains。您仍然可以使用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"]