Отрицание буквенных строк в регулярном выражении Java

голоса
4

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

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

Я пытался Patterns как:

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

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

Эта строка:

ClarkRalphKentGuyGreenGardnerBruceBatmanKent

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

  1. ClarkRalphKent
Задан 09/12/2008 в 22:15
источник пользователем
На других языках...                            


4 ответов

голоса
6

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

пытаться: Clark.+?Kent

Ответил 09/12/2008 в 22:25
источник пользователем

голоса
4

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

Ответил 09/12/2008 в 22:27
источник пользователем

голоса
3

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

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

Ответил 09/12/2008 в 22:38
источник пользователем

голоса
2

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

видеть http://perldoc.perl.org/perlre.html

Ответил 09/12/2008 в 22:27
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more