472 Stimmen

Regulärer Ausdruck, um eine Zeichenkette zu finden, die zwischen zwei Zeichen eingeschlossen ist, wobei die Begrenzungszeichen AUSGESCHLOSSEN werden

Ich muss aus einer Zeichenkette einen Satz von Zeichen extrahieren, die zwischen zwei Begrenzungszeichen enthalten sind, ohne die Begrenzungszeichen selbst zurückzugeben.

Ein einfaches Beispiel soll dies verdeutlichen:

Ziel : Extrahiert die Teilzeichenkette zwischen eckigen Klammern, ohne die Klammern selbst zurückzugeben.

Basiskette : This is a test string [more or less]

Wenn ich z. B. die folgende Regelung verwende.

\\\[.\*?\\\]

Das Spiel ist [more or less] . Ich brauche nur zu bekommen more or less (ohne die Klammern).

Ist es möglich, dies zu tun?

722voto

cletus Punkte 596503

Leicht gemacht:

(?<=\[)(.*?)(?=\])

Technisch gesehen ist das die Verwendung von Lookaheads und Lookbehinds. Siehe Lookahead- und Lookbehind-Assertionen mit Null-Breite . Das Muster besteht aus:

  • geht ein [ die nicht erfasst wird (lookbehind);
  • eine nicht gierige gefangene Gruppe. Es ist nicht gierig, bei der ersten ] und
  • wird gefolgt von einer ] die nicht erfasst wird (Lookahead).

Alternativ können Sie auch nur das erfassen, was zwischen den eckigen Klammern steht:

\[(.*?)\]

und die erste erfasste Gruppe anstelle des gesamten Spiels zurückgeben.

80voto

Zanon Punkte 25577

Wenn Sie Folgendes verwenden JavaScript die Lösung bereitgestellt von cletus, (?<=\[)(.*?)(?=\]) funktioniert nicht, weil JavaScript den lookbehind-Operator nicht unterstützt.

bearbeiten : tatsächlich, jetzt (ES2018) ist es möglich, den lookbehind-Operator zu verwenden. Einfach hinzufügen / um die Regex-Zeichenkette zu definieren, etwa so:

var regex = /(?<=\[)(.*?)(?=\])/;

Alte Antwort :

Lösung:

var regex = /\[(.*?)\]/;
var strToMatch = "This is a test string [more or less]";
var matched = regex.exec(strToMatch);

Sie wird zurückkehren:

["[more or less]", "more or less"]

Was Sie also brauchen, ist der zweite Wert. Verwenden:

var matched = regex.exec(strToMatch)[1];

Zur Rückkehr:

"more or less"

29voto

Xetius Punkte 41879

Sie müssen nur den Teil zwischen den Klammern "einfangen".

\[(.*?)\]

Zur Erfassung setzen Sie es in Klammern. Sie geben nicht an, in welcher Sprache dies geschieht. In Perl zum Beispiel würden Sie darauf über die Variable $1 zugreifen.

my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";

Andere Sprachen haben andere Mechanismen. C#, zum Beispiel, verwendet die Match-Sammlung Klasse, glaube ich.

27voto

stevec Punkte 25346

Hier ist ein allgemeines Beispiel mit offensichtlichen Begrenzungszeichen ( X y Y ):

(?<=X)(.*?)(?=Y)

Hier wird es verwendet, um die Zeichenkette zwischen X y Y . Rubel-Beispiel aquí , oder siehe Bild:

enter image description here

19voto

Stieneee Punkte 171

[^\[] Entspricht jedem Zeichen, das nicht [.

+ Finde 1 oder mehrere der folgenden Dinge, die nicht [ . Erzeugt Gruppen dieser Übereinstimmungen.

(?=\]) Positive Vorausschau ] . Passt zu einer Gruppe, die mit ] ohne sie in das Ergebnis aufzunehmen.

Erledigt.

[^\[]+(?=\])

Der Beweis.

http://regexr.com/3gobr

Ähnlich wie bei der von null vorgeschlagenen Lösung. Aber die zusätzliche \] ist nicht erforderlich. Eine zusätzliche Anmerkung: Es scheint \ ist nicht erforderlich, um die [ nach dem ^ . Aus Gründen der Lesbarkeit würde ich es drin lassen.

Funktioniert nicht in der Situation, in der die Trennzeichen identisch sind. "more or less" zum Beispiel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X