Java Regex无法正确匹配

时间:2012-11-25 19:06:44

标签: java regex string

我需要检查一个字符串是否有自己的等号。我现在的正则表达式似乎不适用于Java,即使RegexPal匹配它。

我目前的代码是:

String str = "test=tests";
System.out.println(str + " - " + str.matches("[^=]=[^=]"));

在以下测试用例中,第一个应该匹配,第二个不应该匹配:

test=tests // matches t=t
test==tests // doesn't match

Regex Pal做得对,但是,由于某种原因,Java在两个测试用例中都返回false。我在某个地方出错了吗?

谢谢!

4 个答案:

答案 0 :(得分:6)

Java的String.matches function匹配整个字符串,而不仅仅是一个部分。这意味着,它大致相当于正则表达式^[^=]=[^=]$,因此两者都返回false。要构建与您的正则表达式相同的正则表达式,您应该使用:

str.matches("(?s).*[^=]=[^=].*")

(?s)确保.匹配所有内容。)

或者,您可以构建Pattern并使用Matcher以获得更大的灵活性。这就是String.matches使用的。

final Pattern p = Pattern.compile("[^=]=[^=]");
final Matcher m = p.matcher(str);
return m.find();

答案 1 :(得分:1)

您必须在正则表达式中添加*+

str.matches("[^=]+=[^=]+")

这是必需的,因为string.matches()默认是锚定的。这相当于^[^=]+=[^=]+$,意味着它必须匹配整个字符串而不仅仅是它的一部分。

答案 2 :(得分:1)

您只是在single之前和之后匹配=字符。现在,由于String#matches尝试将complete字符串与给定的Pattern匹配,因此您需要确保覆盖其中的完整字符串。显然,您的字符串在many characters之前和之后都包含=

因此,要指定此项,您需要使用quantifier,此处: -

  • +匹配one or more个字符
  • *匹配zero or more个字符

因此,您需要将正则表达式更改为: -

System.out.println(str + " - " + str.matches("[^=]+=[^=]+"))

答案 3 :(得分:1)

问题是String.matches()不会搜索匹配的子序列,而是尝试将完整的字符串与您的模式匹配。

出于您的目的,您需要Matcher.find():http://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html#find()