java.util.regex.Pattern可以进行部分匹配吗?

时间:2010-03-26 21:06:58

标签: java regex

是否可以知道流/字符串是否包含 匹配正则表达式的输入。

例如

 String input="AA";
 Pattern pat=Pattern.compile("AAAAAB");
 Matcher matcher=pat.matcher(input);
 //<-- something here returning true ?

 String input="BB";
 Pattern pat=Pattern.compile("AAAAAB");
 Matcher matcher=pat.matcher(input);
 //<-- something here returning false ?

由于

5 个答案:

答案 0 :(得分:12)

是的,Java提供了一种方法。首先,您必须调用一种标准方法来应用正则表达式,例如matches()find()。如果返回false,则可以使用hitEnd()方法查明是否有更长的字符串匹配:

String[] inputs = { "AA", "BB" };
Pattern p = Pattern.compile("AAAAAB");
Matcher m = p.matcher("");
for (String s : inputs)
{
  m.reset(s);
  System.out.printf("%s -- full match: %B; partial match: %B%n",
                    s, m.matches(), m.hitEnd());
}

输出:

AA -- full match: FALSE; partial match: TRUE
BB -- full match: FALSE; partial match: FALSE

答案 1 :(得分:8)

实际上,你很幸运:Java的正则表达式确实有你想要的方法:

public boolean hitEnd()

  

如果在此匹配器执行的最后一次匹配操作中搜索引擎命中了输入的结尾,则返回true。

     

当此方法返回true时,更多输入可能会更改上次搜索的结果。

所以在你的情况下:

String input="AA";
Pattern pat=Pattern.compile("AAB");
Matcher matcher=pat.matcher(input);
System.out.println(matcher.matches()); // prints "false"
System.out.println(matcher.hitEnd());  // prints "true"

答案 2 :(得分:1)

hitEnd的替代方法是在RE本身中指定要求。

// Accepts up to 5 'A's or 5 'A's and a 'B' (and anything following)
Pattern pat = Pattern.compile("^(?:A{1,5}$|A{5}B)");
boolean yes = pat.matcher("AA").find();
boolean no = pat.matcher("BB").find();

答案 3 :(得分:0)

Matcher.matches()不能做你想做的事吗?

答案 4 :(得分:-1)

如果您只想检查字符串是否包含正则表达式指定的某种模式:

String s = ...;
s.matches( regex )