it-swarm.com.de

Regulärer Ausdruck, um eine Zeichenfolge zwischen zwei Zeichen zu finden, während die Trennzeichen ausgeschlossen werden

Ich muss aus einer Zeichenfolge eine Gruppe von Zeichen extrahieren, die zwischen zwei Trennzeichen eingeschlossen sind, ohne die Trennzeichen selbst zurückzugeben.

Ein einfaches Beispiel sollte hilfreich sein:

Target : extrahiert die Teilzeichenfolge zwischen eckigen Klammern, ohne die Klammern selbst zurückzugeben.

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

Wenn ich folgende reg. Ex.

[more or less]. Ich brauche nur more or less (ohne die Klammern). 

Kann man das machen?

232
Diego

Einfach gemacht:

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

Technisch werden Lookaheads und Lookbehinds verwendet. Siehe Lookahead und Lookbehind Zero-Width Assertions . Das Muster besteht aus:

  • wird ein [vorangestellt, das nicht erfasst wird (lookbehind);
  • eine nicht gierige gefangene Gruppe. Es ist nicht gierig, beim ersten Anhalten anzuhalten]; und
  • gefolgt von a], das nicht erfasst wird (Lookahead).

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.

355
cletus

Wenn Sie JavaScript verwenden, funktioniert erste Lösung von cletus (?<=\[)(.*?)(?=\]) nicht, da JavaScript den Lookbehind-Operator nicht unterstützt.

Die zweite Lösung funktioniert jedoch gut, aber Sie müssen das zweite übereinstimmende Element erhalten.

Beispiel:

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

Es wird zurückkehren:

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

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

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

Zurückgeben:

"more or less"
43
Zanon

Sie müssen nur das Bit zwischen den Klammern "einfangen".

\[(.*?)\]

Zum Erfassen setzen Sie es in Klammern. Sie sagen nicht, welche Sprache verwendet wird. In Perl würden Sie beispielsweise mit der Variablen $ 1 darauf zugreifen.

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

Andere Sprachen haben unterschiedliche Mechanismen. Ich glaube, C # verwendet zum Beispiel die Klasse Match collection .

17
Xetius

PHP:

$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);
8
powtac

[^\[] Entspricht einem beliebigen Zeichen, das nicht [ist. 

+ Entspricht mindestens 1 der Elemente, die nicht [ sind. Erzeugt Gruppen dieser Übereinstimmungen.

(?=\]) Positiver Lookahead ]. Findet eine Gruppe, die mit ] endet, ohne sie in das Ergebnis aufzunehmen.

Erledigt.

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

Beweis.

http://regexr.com/3gobr

Ähnlich der von null vorgeschlagenen Lösung. Der zusätzliche \] ist jedoch nicht erforderlich. Als zusätzliche Anmerkung scheint es, dass \ nicht erforderlich ist, um den [ nach dem ^ zu entgehen. Zur besseren Lesbarkeit würde ich es lassen.

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

5
Stieneee

Dieser funktioniert speziell für den Parser für reguläre Ausdrücke in JavaScript /[^[\]]+(?=])/g

führen Sie dies einfach in der Konsole aus 

var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;
3
null

Um auch die [] zu entfernen, verwenden Sie:

\[.+\]
3

Ich hatte das gleiche Problem bei der Verwendung von Regex mit Bash-Scripting .. Ich verwendete eine 2-Schritt-Lösung, die Pipes mit grep -o anwendete 

 '\[(.*?)\]'  

zuerst, dann

'\b.*\b'

Offensichtlich nicht so effizient bei den anderen Antworten, aber eine Alternative. 

2
A. Jesús

Ich wollte einen String zwischen/und # finden, aber # ist manchmal optional. Hier ist die Regex, die ich verwende:

  (?<=\/)([^#]+)(?=#*)
0
techguy2000

Hier ist, wie ich in C # ohne '[' und ']' kam:

        var text = "This is a test string [more or less]";
        //Getting only string between '[' and ']'
        Regex regex = new Regex(@"\[(.+?)\]");
        var matchGroups = regex.Matches(text);
        for (int i = 0; i < matchGroups.Count; i++)
        {
            Console.WriteLine(matchGroups[i].Groups[1]);
        }

Die Ausgabe ist:

more or less
0
Jamaxack