Lorsque les questions sont formulées à partir d'un seul exemple, des ambiguïtés sont inévitablement présentes. Cette question ne fait pas exception.
Pour l'exemple donné dans la question, la chaîne souhaitée est claire:
super example of string key : text I want to keep - end of my string
^^^^^^^^^^^^^^^^^^^
Cependant, cette chaîne n'est qu'un exemple de chaînes et de chaînes de limite pour lesquelles certaines sous-chaînes doivent être identifiées. Je considérerai une chaîne générique avec des chaînes de limite génériques, représentées comme suit.
abc FF def PP ghi,PP jkl,FF mno PP pqr FF,stu FF vwx,PP yza
^^^^^^^^^^^^ ^^^^^
PP
est la chaîne précédente , FF
est la chaîne suivante et les chapeaux de partie indiquent quelles sous-chaînes doivent être mises en correspondance. (Dans l'exemple donné dans la question key :
est la chaîne précédente et -
est la chaîne suivante.) J'ai supposé que PP
et FF
sont précédés et suivis par des limites de mot (de sorte que PPA
et FF8
ne correspondent pas).
Mes hypothèses, telles que reflétées par les chapeaux de fête, sont les suivantes:
- La première sous
PP
- chaîne peut être précédée d'une (ou plusieurs) FF
sous-chaînes qui, si elles sont présentes, ne sont pas prises en compte;
- Si
PP
est suivi d'un ou plusieurs PP
s avant de FF
rencontrer, les PP
s suivants font partie de la sous-chaîne entre les chaînes précédente et suivante;
- Si
PP
est suivi d'un ou de plusieurs FF
s avant la PP
rencontre d'un, le premier FF
suivant PP
est considéré comme la chaîne suivante.
Notez que la plupart des réponses ici ne traitent que des chaînes du formulaire
abc PP def FF ghi
^^^^^
ou
abc PP def FF ghi PP jkl FF mno
^^^^^ ^^^^^
On peut utiliser une expression régulière, des constructions de code ou une combinaison des deux pour identifier les sous-chaînes d'intérêt. Je ne porte aucun jugement sur la meilleure approche. Je ne présenterai que l'expression régulière suivante qui correspondra aux sous-chaînes d'intérêt.
(?<=\bPP\b)(?:(?!\bFF\b).)*(?=\bFF\b)
Démarrez votre moteur! 1
J'ai testé cela avec le moteur de regex PCRE (PHP), mais comme le regex n'est pas du tout exotique, je suis sûr qu'il fonctionnera avec le moteur de regex .NET (qui est très robuste).
Le moteur regex effectue les opérations suivantes:
(?<= : 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
Cette technique, consistant à faire correspondre un caractère à la fois, en suivant la chaîne précédente, jusqu'à ce que le caractère soit F
et soit suivi par F
(ou plus généralement, le caractère étant la chaîne qui constitue la chaîne suivante), est appelée Solution de jeton gourmand tempéré .
Naturellement, l'expression rationnelle devrait être modifiée (si possible) si les hypothèses que j'ai énoncées ci-dessus sont modifiées.
1. Déplacez le curseur pour des explications détaillées.
substring
etindexof