3

我需要检查一个字符串本身是否有任何等号。我当前的正则表达式似乎在 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

4 回答 4

6

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

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

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

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

final Pattern p = Pattern.compile("[^=]=[^=]");
final Matcher m = p.matcher(str);
return m.find();
于 2012-11-25T19:11:11.377 回答
1

您必须添加*或添加+到您的正则表达式:

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

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

于 2012-11-25T19:07:58.350 回答
1

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

因此,要指定这一点,您需要在quantifier此处使用 a :-

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

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

System.out.println(str + " - " + str.matches("[^=]+=[^=]+"))
于 2012-11-25T19:08:38.537 回答
1

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

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

于 2012-11-25T19:15:07.100 回答