Как избежать неявных "^" и "$" в сопоставлении регулярных выражений Java? - PullRequest
4 голосов
/ 03 марта 2009

Я пытался выполнить сравнительно простое сопоставление регулярных выражений в Java 1.4.2. Мне намного удобнее работать с Perl. Вот что происходит:

Я пытаюсь найти соответствие / ^ / из ""

Я пытаюсь:

Pattern myPattern= Pattern.compile("^<foo>");
Matcher myMatcher= myPattern.matcher("<foo><bar>");
System.out.println(myMatcher.matches());

И я получаю «ложь»

Я привык говорить:

print "<foo><bar>" =~ /^<foo>/;

, который действительно возвращает истину.

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

«Метод String дополнительно оптимизирует критерии поиска, помещая невидимое ^ перед шаблоном и $ после него».

Когда я пытался:

Pattern myPattern= Pattern.compile("^<foo>.*");
Matcher myMatcher= myPattern.matcher("<foo><bar>");
System.out.println(myMatcher.matches());

тогда возвращается ожидаемое истина. Я не хочу эту модель, хотя. Завершение. * Не должно быть необходимо.

Затем я обнаружил метод Matcher.useAnchoringBounds (boolean). Я думал, что прямое указание не использовать границы привязки будет работать. Это не так. Я попытался выдать

myMatcher.reset();

на случай, если мне понадобится очистить его после отключения атрибута. Неудачно. Впоследствии вызов .matches () по-прежнему возвращает false.

Что я упустил из виду?

Edit: Ну, это было легко, спасибо.

Ответы [ 3 ]

11 голосов
/ 03 марта 2009

Используйте метод Matcher find (вместо метода match )

3 голосов
/ 03 марта 2009

Если вы изучите «соответствие», какую часть входной строки вы ожидаете найти?

Другими словами,

Matcher myMatcher= myPattern.matcher("<foo><bar>");
if (myMatcher.matches()) {
  System.out.println(myMatcher.group(0));
}

& hellip; что печатать надо?

Если вы ожидаете, что он напечатает только "<foo>", используйте метод find() для Matcher вместо matches(). Если вы действительно хотите найти совпадения, когда ввод начинает с "<foo>", то вам нужно явно указать это с помощью '^'.

Если вы ожидаете, что он будет соответствовать "<foo><bar>", вам необходимо включить в конце ".*".

3 голосов
/ 03 марта 2009

Matcher.useAnchoringBounds() был добавлен в JDK1.5, поэтому, если вы используете 1.4, я не уверен, что это поможет вам, даже если бы оно работало (обратите внимание на @since 1.5 в Javadocs) .

В Javadocs для Matcher также указано, что метод match() :

Пытается сопоставить всю область с шаблоном.

(акцент мой)

Что объясняет, почему вы получили .matches() == true только когда изменили шаблон, чтобы он заканчивался на .*.

Для сопоставления с регионом, начинающимся с начала, но не обязательно требующим сопоставления всего региона, используйте методы find() или lookingAt().

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