Может ли java.util.regex.Pattern выполнять частичные совпадения? - PullRequest
9 голосов
/ 27 марта 2010

Можно ли узнать, содержит ли поток / строка входные данные, которые могут соответствовать регулярному выражению.

Например

 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 ]

12 голосов
/ 27 марта 2010

Да, 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
8 голосов
/ 27 марта 2010

На самом деле вам повезло: в регулярном выражении Java есть нужный метод:

public boolean hitEnd()

Возвращает истину, если поисковый механизм достиг конца ввода во время последней операции сопоставления, выполненной этим сопоставителем.

Когда этот метод возвращает 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"
1 голос
/ 27 марта 2010

Альтернативой 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();
0 голосов
/ 27 марта 2010

Если вы просто хотите проверить, содержит ли строка какой-либо шаблон, заданный регулярным выражением:

String s = ...;
s.matches( regex )
0 голосов
/ 27 марта 2010

Matcher.matches () не делает то, что вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...