Поиск блока, содержащего два слова - PullRequest
0 голосов
/ 13 января 2019

У меня есть текст

1 fgj sel dfjkd prm jfkdl frm jkl tbl klk

2 ledk prm jkl jkk frm jkl tbl jkl fjj

3 Джек сел прм клйлк джккл джккл тбл эмель

4 rui jkljl sel jklj jklj prm jkjl

5 jljkj frm jkljl jlj tbl mjljlk

Мне нужен блок, который начинается с "sel" и заканчивается "tbl". И этот блок содержит два слова «prm» и «frm». То есть блок состоит из последовательности слов «sel», «prm», «frm», «tbl». И правильный ответ должен быть (часть первой строки, часть четвертой и пятой строки)

sel dfjkd prm jfkdl frm jkl tbl

sel jklj jklj prm jkjl

5 jljkj frm jkljl jlj tbl

Я пытался, но у меня не получается

(sel)*?(prm|frm)?*(tbl)

или около того

\bsel\b.*?\bprm\b.*?\bfrm\b.*?\btbl\b

1 Ответ

0 голосов
/ 13 января 2019

Вам нужно использовать два положительных взгляда с закаленной негладкой точкой внутри , чтобы установить границу при поиске prm и frm. Эта граница достигается при достижении строки tbl. Попробуйте:

(?s)sel(?=((?!tbl).)*?prm)(?=(?1)*?frm)(?1)*tbl

Смотрите демо здесь

...