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

java.util.regex.Pattern是否可以进行部分匹配?,java,regex,Java,Regex,是否可以知道流/字符串是否包含可以与正则表达式匹配的输入 比如说 String input="AA"; Pattern pat=Pattern.compile("AAAAAB"); Matcher matcher=pat.matcher(input); //<-- something here returning true ? String input=“AA”; Pattern pat=Pattern.compile(“aaaab”); 匹配器匹配器=匹配器(输入); // 不

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

比如说

 String input="AA";
 Pattern pat=Pattern.compile("AAAAAB");
 Matcher matcher=pat.matcher(input);
 //<-- something here returning true ?
String input=“AA”;
Pattern pat=Pattern.compile(“aaaab”);
匹配器匹配器=匹配器(输入);

// 不执行您想要的操作?

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

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

是的,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

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

如果搜索引擎在此匹配器执行的最后一次匹配操作中命中了输入的结尾,则返回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"

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();

regex的工作原理并非如此。模式应该是输入的子字符串,否则没有匹配项。你可以写你自己的东西,做同样的事情,但它会像一个反向正则表达式。如果您反转“输入”和“模式”字符串,然后调用matcher.matches(输入)-您将得到您想要的。他想要相反的结果。他的模式是更长的字符串,他想找出目前为止的输入匹配。
// 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();