2017-01-18 3 views
1

Ich habe eine Textdatei wie folgt aus:Regulärer Ausdruck für Text mit mehreren Zeichenbegrenzer

::content1 ... 
... 
::content2 ... 
... 
::content3 ... 
... 

So ist der Text (mehrzeilige) wird begrenzt durch „::“ und ich möchte die Spiele zwischen finden. Vielleicht ist der beste Weg, "::" durch ein Zeichen zu ersetzen und dann die Split-Methode in VB.Net zu verwenden. Aber ich frage mich, ob dies auch mit einem regulären Ausdruck durchgeführt werden kann, wie folgt aus:

Dim myRegex as RegEx = new Regex("...")   
m = myRegex.Match(content) 
Do While m.Success 
    ... 
    m = m.NextMatch()   
Loop 

Es schien einfach, aber ich kann nicht das richtige Muster für reguläre Ausdrücke finden.

Bearbeiten: Jemand fragte, was ich schon versucht hatte. Ich habe versucht, negative Lookahead, aber es funktioniert nicht. (Ich benutze die [\ S \ s] statt „“, weil ich die Zeit verstehen, um eine neue Zeile Zeichen nicht übereinstimmt. Vielleicht ist das mein armes Verständnis für reguläre Ausdrücke.)

Dim myRegex as RegEx = new Regex("::(?![\S\s]+::)[\S\s]+")   
+0

Ich ging davon aus, dass die VB.Net-Split-Methode nur ein Zeichen unterstützt, aber vielleicht ist das nicht korrekt. Aber das war nicht meine Frage. – esims

+0

Bitte fügen Sie mindestens die Ausdrücke hinzu, die Sie ausprobiert haben. Und wenn das Trennzeichen immer am Anfang der Zeile steht, sollte es einfach sein. Oder wenn es nicht ist, fügen Sie bitte ein aktuelles Beispiel der Daten hinzu –

+0

Ich habe ein Beispiel zur Verfügung gestellt. Und ja, das Trennzeichen steht immer am Anfang einer Zeile (neue Zeile). – esims

Antwort

1

Hinweis Ihre ::(?![\S\s]+::)[\S\s]+ Muster :: übereinstimmt, die mit irgendwelchen 1+ Zeichen nicht beachtet werden ([\s\S]+) mit :: gefolgt, und passt dann alle 1+ Zeichen. Damit findet das Muster die letzte :: und was danach ist.

Beachten Sie, dass Sie in diesem Fall wirklich auf eine Regex verzichten können, wenn die :: immer den Inhalt abgrenzen. Hier ist eine Möglichkeit, es zu tun:

Dim result As String() = str.Split(New String() {"::"}, StringSplitOptions.RemoveEmptyEntries) 

Wenn Sie mit :: teilen möchten, die am Anfang der Linien sind, könnten Sie einen regulären Ausdruck wie

Dim result As List(Of String) = Regex.Split(str, "^::", RegexOptions.Multiline).Where(
     Function(m) String.Equals(m.Trim(), String.Empty) = False).ToList() 

verwenden möchten, wo RegexOptions.Multiline^ machen Entsprechen Sie dem Anfang einer Zeile, nicht dem Anfang einer Zeichenfolge.

+0

Du hast recht, dass mein Muster nur das letzte '::' und danach gefunden hat. Ich habe deinen regelmäßigen Ausdruck nicht ausprobiert, aber ich nehme deinen Rat besser an, sie in diesem Fall nicht zu verwenden. – esims

+0

Was ich fuhr war, dass Regex ist großartig, wenn Sie Teile des Textes in einem bestimmten Kontext, der mit Regex beschrieben werden kann, erhalten möchten. Falls Sie nur Text mit einer Literal-Zeichenfolge teilen müssen, müssen Sie Regex nicht verwenden, es ist in diesem Moment nicht angebracht, sie zu verwenden. –

0

Keine Notwendigkeit, Verwenden Sie regulären Ausdruck. Teilen Sie den Text unter ::.

content.Split("::") 
+0

@esims Um mehr als ein Char zu verwenden, brauchst du 'Split (YourString," :: ")' – genespos