Когда вопросы формулируются в терминах единственного примера, неизбежно присутствует двусмысленность. Этот вопрос не исключение.
Для примера, приведенного в вопросе, желаемая строка ясна:
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
за ним следует один или несколько PP
s, прежде чем FF
встретится, следующееPP
s являются частью подстроки между предыдущей и следующей строками;
- Если
PP
следует один или более FF
секунд до того, 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), но, поскольку регулярное выражение вовсе не экзотично, я уверен, что оно будет работать с механизмом регулярных выражений .NET (который очень надежен).
Механизм регулярных выражений выполняет следующие операции:
(?<= : 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
(или, в более общем смысле, символ представляет собой строку, составляющую следующую строку), называется Tempered Greedy Token Solution .
Естественно, что регулярное выражение должно быть изменено (если возможно), если предположения, которые я изложил выше, будут изменены.
1. Переместите курсор для получения подробных объяснений.
substring
andindexof