Cuando las preguntas se formulan en términos de un solo ejemplo, es inevitable que surjan ambigüedades. Esta pregunta no es una excepción.
Para el ejemplo dado en la pregunta, la cadena deseada es clara:
super example of string key : text I want to keep - end of my string
^^^^^^^^^^^^^^^^^^^
Sin embargo, esta cadena no es más que un ejemplo de cadenas y cadenas de límites para las que se deben identificar ciertas subcadenas. Consideraré una cadena genérica con cadenas de límite genéricas, representadas de la siguiente manera.
abc FF def PP ghi,PP jkl,FF mno PP pqr FF,stu FF vwx,PP yza
^^^^^^^^^^^^ ^^^^^
PP
es la cadena anterior , FF
es la cadena siguiente y los sombreros de fiesta indican qué subcadenas deben coincidir. (En el ejemplo dado en la pregunta key :
es la cadena anterior y -
es la cadena siguiente.) He asumido que PP
y FF
están precedidos y seguidos por límites de palabras (de modo que PPA
y FF8
no coinciden).
Mis suposiciones, reflejadas en los sombreros de fiesta, son las siguientes:
- La primera subcadena
PP
puede estar precedida por una (o más) FF
subcadenas, que, si están presentes, se ignoran;
- Si
PP
va seguido de uno o más PP
s antes FF
, los siguientes PP
s son parte de la subcadena entre las cadenas anterior y siguiente;
- Si
PP
va seguido de uno o más FF
s antes de encontrar un PP
es, el primer FF
siguiente PP
se considera que es la siguiente cadena.
Tenga en cuenta que muchas de las respuestas aquí tratan solo con cadenas de la forma
abc PP def FF ghi
^^^^^
o
abc PP def FF ghi PP jkl FF mno
^^^^^ ^^^^^
Se puede usar una expresión regular, construcciones de código o una combinación de las dos para identificar las subcadenas de interés. No hago ningún juicio sobre cuál es el mejor enfoque. Solo presentaré la siguiente expresión regular que coincidirá con las subcadenas de interés.
(?<=\bPP\b)(?:(?!\bFF\b).)*(?=\bFF\b)
¡Enciende tu motor! 1
Probé esto con el motor de expresiones regulares PCRE (PHP), pero como la expresión regular no es nada exótica, estoy seguro de que funcionará con el motor de expresiones regulares .NET (que es muy robusto).
El motor de expresiones regulares realiza las siguientes operaciones:
(?<= : 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
Esta técnica, de hacer coincidir un carácter a la vez, siguiendo la cadena anterior, hasta que el carácter es F
y es seguido por F
(o más generalmente, el carácter inicia la cadena que constituye la siguiente cadena), se llama Solución de token codicioso templado .
Naturalmente, la expresión regular tendría que modificarse (si es posible) si se cambian las suposiciones que establecí anteriormente.
1. Mueva el cursor para obtener explicaciones detalladas.
substring
yindexof