2013-08-18 3 views
0

Привет У меня есть пункт вроде этого:Regex для извлечения строк после последнего совпадения

  output 123 

      Deepak everywhere 
      Deepak where are 

      output 123 

      Ankur Everywhere 
      Deepak where are 

      last 

      Deepak everywhere 
      Deepak where are 

Я хочу, чтобы извлечь после последнего вхождения «выхода 123» до «последнего». Это то, что я ожидал:

  Ankur Everywhere 
      Deepak where are 

      last 

Я использую этот RegEx шаблон - (?<=(output))([^\\n]*)last. Но используя это, я получаю:

  output 123 

      Deepak everywhere 
      Deepak where are 

      output 123 

      Ankur Everywhere 
      Deepak where are 

      last 

Может ли кто-нибудь помочь? Я использую этот инструмент - http://regexr.com?360ek

+0

Какой язык вы используете? – keyboardP

+0

Я использую Java –

ответ

0

Вам необходимо убедиться, что символы, которые вы повторяете, не могут содержать output или last. Вы можете сделать это с помощью отрицательного предпросмотра в каждой позиции:

(?<=output)\w+((?:(?!output|last)[^])*)last 

Сначала убедитесь, чтобы начать после output (как вы это делали в своей собственной попытки). Затем мы сопоставляем следующее слово (потому что вы не хотите его в своей захваченной группе). Затем идет интересная часть: в каждой позиции мы проверяем, что нет output или last с (?!output|last). Затем мы сопоставляем произвольный символ с [^]. И затем повторяем, пока не найдем last. Вместо [^] вы также можете использовать [\s\S] или . и опцию dotall.

Working demo.

+0

123 жестко закодирован .. выход 123 был всего лишь примером. Подумайте об этом, если это было «output 123454» ИЛИ «output abcdef», тогда я dnt hw, я отредактирую это Regex, которое вы предоставили. –

+0

@NDeepakPrasath просто оставить «123». и если вы не хотите этого в результате, сопоставьте одно слово перед началом захвата. отредактировал ответ –

+0

Я не понимаю. Я хочу вывод после 123 или любое слово, которое следует за выходом. Например, если это «output abc», то я хочу после abc. если это «output def», то я хочу после def.В любом случае, я не хочу, чтобы abc и def были включены в результат. Спасибо заранее @ m.buettber –

0

Это должно работать:

Pattern p = Pattern.compile("(?<=output)(?!.*?output)[^\\s]+(.*?last)", Pattern.DOTALL); 
Matcher m = p.matcher(s); 
if (m.find()) { 
    System.out.println(m.group(1)); 
} 
else 
    System.out.println("NO Match"); 

ВЫВОД:

Ankur Everywhere 
Deepak where are 

last 
+0

Сплошность не влияет на внешний вид (за исключением, может быть, производительности, но это зависит от входной строки). –

+0

Да, что true @ m.buettner даже '(? <= Output) (?!. * Output) (. * Last)' будет работать. Я просто привык к не жадным. – anubhava

+0

Последний пример привел бы к неправильному результату, хотя бы, если существует несколько 'last'. Кроме того, по умолчанию для неграмотности чаще всего применяется плохая практика;). Есть почти всегда лучшие (более быстрые) альтернативы. –

1

Вы можете использовать этот шаблон и извлечь первую группу захвата:

output\\b[^\\n]*\\s*((?>[^o\\s]++|\\s++(?!last\\b)|o(?!utput\\b))++)(?=\\s+last\b) 

детали:

output\\b[^\\n]*\\s* # the begining (exclude from the final result 
        # but used as an anchor) 
(      # open the capturing group 
    (?>     # open an atomic group (all the possible content) 
     [^o\\s]++   # all that is not a "o" or a white character 
     |     # OR 
     \\s++(?!last\\b) # white characters but not followed by "last" 
          # (here the possessive quantifier is needed to forbid 
          # backtracks) 
     |     # OR 
     o(?!utput\\b)  # "o" not followed by "utput\b" 
    )++     # repeat the atomic group one or more times 
)       # close the capturing group 
(?=\\s+last\b)   # followed by white characters and "last" 

Вы можете найти содержание группы захвата с: m.group(1)

1

Это должно работать

((? < = (выход 123))) ([^ \ п (? < = 1)] *) последний

Tested url text http://regexr.com?360f9

+0

Привет, Суреш. Благодарю . Я хочу вывод после 123 или любое слово, которое следует за выходом. Я не хочу жесткого кода 123. Например, если это «output abc», то я хочу после abc. если это «output def», то я хочу после def. В любом случае, я не хочу, чтобы abc и def были включены в результат. заранее спасибо –