Wenn Fragen anhand eines einzelnen Beispiels gestellt werden, sind zwangsläufig Mehrdeutigkeiten vorhanden. Diese Frage ist keine Ausnahme.
Für das in der Frage angegebene Beispiel ist die gewünschte Zeichenfolge klar:
super example of string key : text I want to keep - end of my string
^^^^^^^^^^^^^^^^^^^
Diese Zeichenfolge ist jedoch nur ein Beispiel für Zeichenfolgen und Grenzzeichenfolgen, für die bestimmte Teilzeichenfolgen identifiziert werden sollen. Ich werde eine generische Zeichenfolge mit generischen Grenzzeichenfolgen betrachten, die wie folgt dargestellt werden.
abc FF def PP ghi,PP jkl,FF mno PP pqr FF,stu FF vwx,PP yza
^^^^^^^^^^^^ ^^^^^
PP
ist die vorhergehende Zeichenfolge , FF
ist die folgende Zeichenfolge und die Partyhüte geben an, welche Teilzeichenfolgen abgeglichen werden sollen. (In dem in der Frage angegebenen Beispiel key :
handelt es sich um die vorhergehende Zeichenfolge und -
die folgende Zeichenfolge.) Ich habe angenommen, dass PP
und FF
vor und nach Wortgrenzen (so dass PPA
und FF8
nicht übereinstimmen).
Meine Annahmen, die sich in den Partyhüten widerspiegeln, lauten wie folgt:
- Dem ersten Teilstring
PP
kann ein (oder mehrere) vorangestellt sein.FF
Teilstrings , die, falls vorhanden, nicht berücksichtigt werden.
- Wenn
PP
ein oder mehrere PP
s folgen, bevor FF
Folgendes auftrittPP
s Teil der Teilzeichenfolge zwischen den vorhergehenden und folgenden Zeichenfolgen.
- Wenn vor einer Begegnung
PP
ein oder mehrere FF
s folgen PP
, wird die erste FF
Folge PP
als die folgende Zeichenfolge betrachtet.
Beachten Sie, dass viele der Antworten hier nur Zeichenfolgen des Formulars betreffen
abc PP def FF ghi
^^^^^
oder
abc PP def FF ghi PP jkl FF mno
^^^^^ ^^^^^
Man kann einen regulären Ausdruck, Codekonstrukte oder eine Kombination der beiden verwenden, um die interessierenden Teilzeichenfolgen zu identifizieren. Ich kann nicht beurteilen, welcher Ansatz am besten ist. Ich werde nur den folgenden regulären Ausdruck präsentieren, der zu den interessierenden Teilzeichenfolgen passt.
(?<=\bPP\b)(?:(?!\bFF\b).)*(?=\bFF\b)
Starten Sie Ihren Motor! 1
Ich habe dies mit der Regex-Engine PCRE (PHP) getestet, aber da die Regex überhaupt nicht exotisch ist, bin ich sicher, dass sie mit der Regex-Engine .NET (die sehr robust ist) funktioniert.
Die Regex-Engine führt die folgenden Vorgänge aus:
(?<= : 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
Diese Technik besteht darin, jeweils ein Zeichen nach der vorhergehenden Zeichenfolge abzugleichen, bis das Zeichen folgt F
und folgtF
(oder allgemeiner gesagt, das Zeichen ist die Zeichenfolge, aus der die folgende Zeichenfolge besteht), wird als Tempered Greedy Token Solution bezeichnet .
Natürlich müsste der reguläre Ausdruck (wenn möglich) geändert werden, wenn die oben dargelegten Annahmen geändert werden.
1. Bewegen Sie den Cursor, um detaillierte Erklärungen zu erhalten.
substring
undindexof