Коли питання висловлюються в рамках єдиного прикладу, неминуче виникають неясності. Це питання не є винятком.
Для прикладу, наведеного у запитанні, бажаний рядок зрозумілий:
super example of string key : text I want to keep - end of my string
^^^^^^^^^^^^^^^^^^^
Однак цей рядок є лише прикладом рядків і меж рядків, для яких слід визначити певні підрядки. Я розгляну загальну рядок із загальними межевими рядками, представлений наступним чином.
abc FF def PP ghi,PP jkl,FF mno PP pqr FF,stu FF vwx,PP yza
^^^^^^^^^^^^ ^^^^^
PP- це попередній рядок , FF- це наступний рядок, і капелюхи учасників вказують, з якими підрядками потрібно відповідати. (В прикладі , наведеному в питанні key : є попередньої рядки , і -є такий рядок.) Я припустив , що PPі FFпередує , і слід кордонів слів (так що PPAі FF8не збігаються).
Мої припущення, відображені партійними капелюхами, такі:
- Першому підрядку
PPможе передувати один (або більше) FFпідрядків, які, якщо вони є, не враховуються;
- Якщо перед цим зустрічається
PPодне або більше PPs FF, наступні PPs є частиною підрядок між попередньою та наступною строками;
- Якщо до зустрічі a
PPдотримується одне або більше FFs PP, першим FFнаступним PPвважається наступний рядок.
Зауважте, що багато відповідей тут стосуються лише рядків форми
abc PP def FF ghi
^^^^^
або
abc PP def FF ghi PP jkl FF mno
^^^^^ ^^^^^
Можна використовувати звичайний вираз, конструкції коду або їх комбінацію для ідентифікації підрядів, що цікавлять. Я не буду судити, який підхід найкращий. Я представлю лише наступний регулярний вираз, який буде відповідати цікавим підрядкам.
(?<=\bPP\b)(?:(?!\bFF\b).)*(?=\bFF\b)
Запустіть свій двигун! 1
Я перевірив це за допомогою регексу двигуна PCRE (PHP), але оскільки регекс зовсім не екзотичний, я впевнений, що він буде працювати з двигуном .ge regex (який дуже надійний).
Регекс-двигун виконує такі операції:
(?<= : begin a positive lookbehind
\bPP\b : match 'PP'
) : end positive lookbehind
(?: : begin a non-capture group
(?! : begin a negative lookahead
\bFF\b : match 'FF'
) : end negative lookahead
. : match any character
) : end non-capture group
* : execute non-capture group 0+ times
(?= : begin positive lookahead
\bFF\b : match 'FF'
) : end positive lookahead
Цей прийом узгодження одного символу за попереднім рядком до тих пір, поки символом не буде Fі не слідує F(або загалом, персонаж являє собою рядок, що становить наступну рядок), називається загартованим жадним токеном рішення .
Звичайно, якщо змінити викладені вище припущення, змінити регулярний вираз слід (якщо можливо).
1. Перемістіть курсор навколо для отримання детальних пояснень.
substringтаindexof