我需要检查一个字符串是否有自己的等号。我现在的正则表达式似乎不适用于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。我在某个地方出错了吗?
谢谢!
答案 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()