2017-02-15 2 views
0

У меня есть огромный текст, который мне нужно разграничить.Как получить первое совпадение перед матчем

STARTING 
.... 
TEXT 
.... 
END 
STARTING 
.... 
TEXT 
.... 
END 

Все, что я хочу разграничить начало и конец с теми же символами. Но я просто хочу получить текст, если между началом и концом появляется ID: 10. Пример:

STARTING 
.... 
TEXT 
.... 
END 
STARTING 
.... 
TEXT 
ID: 10 
.... 
END 

Желание результат:

STARTING 
.... 
TEXT 
ID: 10 
.... 
END 

Итак, я сделал это регулярное выражение:

START[\s\S]*?ID:\s15[\s\S]*?END 

http://regexr.com/3fa8s

Проблема заключается в следующем: матч перед тем, как текст, когда он должен получить:

START 
ID: 15 
END 

получает:

START 
ID: 13 
END 
START 
ID: 15 
END 

Можно ли получить первый START перед матчем?

Спасибо!

ответ

0

"Temper" [\s\S] узор с (?!START) опережающего просмотра:

START(?:(?!START)[\s\S])*?ID:\s15[\s\S]*?END 

См regex demo

(?:(?!START)[\s\S])*? будет соответствовать любой символ ([\s\S]), 0 или более вхождений, но как можно меньше, что не начинается последовательность START.

Ленивый *? квантор может быть превращен в жадном один, но вам нужно добавить больше альтернатив в упреждающей выборке, то:

START(?:(?!START|END|ID:\s15)[\s\S])*ID:\s15[\s\S]*?END 

См another regex demo

0

шаблон [\s\S] не имеет смысла, это эквивалентно .:

  • \s - пробельные
  • \S - non-whitespace
  • [\s\S] - пробелы или пробелы, поэтому все в основном эквивалентно ..

То, что вы, вероятно, нужно просто регулярное выражение:

/START\s+ID:\s+15\s+END/gm

... который сопрягает ваш сингл «запись» с идентификатором 15.

Но вы также говорят, что вы имеют (...) огромный текст, который вы хотите разграничить (...) ».Это немного противоречит вашему следующему примеру. Если вы хотите получить каждую запись, которая, вероятно, вам нужна, попробуйте использовать:

/START\s+ID:\s+(\d)+\s+END/gm

Смежные вопросы