Ich muss aus einer Zeichenfolge eine Reihe von Zeichen extrahieren, die zwischen zwei Trennzeichen enthalten sind, ohne die Trennzeichen selbst zurückzugeben.
Ein einfaches Beispiel sollte hilfreich sein:
Ziel : Extrahieren Sie die Teilzeichenfolge zwischen eckigen Klammern, ohne die Klammern selbst zurückzugeben.
Basiszeichenfolge :This is a test string [more or less]
Wenn ich die folgende reg benutze. Ex.
\ [. *? \]
Das Match ist [more or less]
. Ich muss nur bekommen more or less
(ohne die Klammern).
Ist es möglich das zu tun?
Antworten:
Einfach gemacht:
Technisch gesehen werden dazu Lookaheads und Lookbehinds verwendet. Siehe Lookahead und Lookbehind Zero-Width Assertions . Das Muster besteht aus:
Alternativ können Sie einfach erfassen, was sich zwischen den eckigen Klammern befindet:
und geben Sie die erste erfasste Gruppe anstelle des gesamten Spiels zurück.
quelle
This is a test string [more [or] less]
würde dies zurückkehrenmore [or] less
?Wenn Sie JavaScript verwenden , funktioniert die erste von cletus bereitgestellte Lösung
(?<=\[)(.*?)(?=\])
nicht, da JavaScript den Lookbehind-Operator nicht unterstützt.Die zweite Lösung funktioniert zwar gut, Sie müssen jedoch das zweite übereinstimmende Element erhalten.
Beispiel:
Es wird zurückkehren:
Was Sie also brauchen, ist der zweite Wert. Verwenden:
Zurückgeben:
quelle
Sie müssen nur das Bit zwischen den Klammern 'erfassen'.
Zum Erfassen setzen Sie es in Klammern. Sie sagen nicht, welche Sprache dies verwendet. In Perl würden Sie beispielsweise mit der Variablen $ 1 darauf zugreifen.
Andere Sprachen haben andere Mechanismen. Ich glaube, C # verwendet zum Beispiel die Match-Auflistungsklasse .
quelle
[^\[]
Entspricht jedem Zeichen, das nicht [.+
Match 1 oder mehr von allem, was nicht ist[
. Erstellt Gruppen dieser Übereinstimmungen.(?=\])
Positiver Lookahead]
. Entspricht einer Gruppe, die mit endet,]
ohne sie in das Ergebnis aufzunehmen.Getan.
Beweis.
http://regexr.com/3gobr
Ähnlich der von null vorgeschlagenen Lösung. Das zusätzliche
\]
ist aber nicht erforderlich. Als zusätzliche Anmerkung scheint\
es nicht erforderlich zu sein, die[
nach dem zu entkommen^
. Zur besseren Lesbarkeit würde ich es belassen.Funktioniert nicht in Situationen, in denen die Trennzeichen identisch sind.
"more or less"
beispielsweise.quelle
PHP:
quelle
Um auch das [] zu entfernen, verwenden Sie:
quelle
Ich hatte das gleiche Problem mit Regex mit Bash-Skripten. Ich habe eine 2-Schritt-Lösung mit Rohren mit grep -o verwendet
Zuerst, dann
Offensichtlich nicht so effizient bei den anderen Antworten, aber eine Alternative.
quelle
Dieser funktioniert speziell für den Parser für reguläre Ausdrücke von Javascript
/[^[\]]+(?=])/g
Führen Sie dies einfach in der Konsole aus
quelle
Ich wollte eine Zeichenfolge zwischen / und # finden, aber # ist manchmal optional. Hier ist die Regex, die ich benutze:
quelle
Hier ist, wie ich ohne '[' und ']' in C # gekommen bin:
Die Ausgabe ist:
quelle
Wenn Sie den Text ohne Klammern extrahieren müssen, können Sie bash awk verwenden
echo " [hola mundo] " | awk -F'[][]' '{print $2}'
Ergebnis:
hola mundo
quelle