Отрицательные буквенные строки в регулярном выражении Java - PullRequest
4 голосов
/ 10 декабря 2008

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

public static void main(String[] args) {
    String s = "ClarkRalphKentGuyGreenGardnerClarkSupermanKent";
    Pattern p = Pattern.compile("Clark.*Kent", Pattern.CASE_INSENSITIVE);
    Matcher myMatcher = p.matcher(s);
    int i = 1;
    while (myMatcher.find()) {
        System.out.println(i++ + ". " + myMatcher.group());
    }
}

генерирует вывод

  1. ClarkRalphKentGuyGreenGardnerClarkSupermanKent

Я хотел бы этот вывод

  1. ClarkRalphKent
  2. ClarkSupermanKent

Я пробовал такие паттерны как:

 Pattern p = Pattern.compile("Clark[^((Kent)*)]Kent", Pattern.CASE_INSENSITIVE);

это не работает, но вы понимаете, что я пытаюсь сказать. Я хочу, чтобы строка от Кларка до Кента не содержала ни одного появления Кента.

Эта строка:

ClarkRalphKentGuyGreenGardnerBruceBatmanKent

должен генерировать вывод

  1. ClarkRalphKent

Ответы [ 4 ]

6 голосов
/ 10 декабря 2008

жадный против неохотный ваш друг здесь.

попробуй: Clark.+?Kent

4 голосов
/ 10 декабря 2008

Вы хотите «неохотный», а не «жадный» квантификатор. Просто вставлять? после того, как ваш * должен сделать трюк.

3 голосов
/ 10 декабря 2008

Когда вы пытались "Clark[^((Kent)*)]Kent", я думаю, что вы хотели "Clark((?!Kent).)*Kent" для отрицательного прогнозирования нулевой ширины (прокрутите немного вниз к заголовку «Подтверждения обзора»).

Скобки указывают совпадение символов и сопоставление с образцом. Таким образом, RegExp пытался найти один символ не в (, K, e, n, t, ), *.

2 голосов
/ 10 декабря 2008

Используйте суффикс ?: Clark.*?Kent За квантификаторами ?, *, + может следовать ?, чтобы указать, что они должны остановиться как можно скорее.

см. http://perldoc.perl.org/perlre.html

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