2016-06-04 18 views
0

Also, das ist das Problem:Regex passt nur zum ersten Auftreten?

Code:

Dim findtext As String = "(?<=<hello>)(.*?)(?=</hello>)" 
Dim myregex As String = TextBox1.Text 
Dim doregex As MatchCollection = Regex.Matches(myregex, findtext) 
MsgBox(doregex(0).ToString) 

TextBox1:

<hello>1</hello> 
<hello>2</hello> 
<hello>3</hello> 

Also, wenn ich den Code ausführen, zeigt es MsgBox mit 1. Warum nur 1? Warum nicht 2 und 3?

Ich habe ? zu .* hinzugefügt, aber es ist immer noch dasselbe.

+0

Sie müssen über Match-Objekt iterieren, um alle Übereinstimmungen zu finden – rock321987

+0

Bessere Verwendung mit LINQ, alles wird viel einfacher. –

+0

LINQ ist Scheiße und @Xen schon beste Lösung, keine Notwendigkeit, ihn zu hassen und mir vorzuschlagen, was zu tun ist, weil Sie nicht die beste Lösung beantwortet: P –

Antwort

1

Die MatchCollection enthält mehrere Elemente, aber Sie rufen nur die erste mit doregex(0). Verwenden Sie eine Schleife mit den anderen zu bekommen:

Dim doregex As MatchCollection = Regex.Matches(myregex, findtext) 
For Each match As Match In doregex 
    MsgBox(match.ToString) 
Next 

EDIT:

Um die Werte zu kombinieren, hängen Sie sie in einen String innerhalb der Schleife, bevor Sie es verwenden:

Dim doregex As MatchCollection = Regex.Matches(myregex, findtext) 
Dim matches As String = "" ' consider StringBuilder if there are many matches 
For Each match As Match In doregex 
    matches = matches + match.ToString + " " 
Next 

MsgBox (Treffer)

+0

Scheint zu funktionieren, aber kann es alle in einer MsgBox kombinieren, anstatt jedes Mal neue zu erstellen, wenn es übereinstimmt? Danke –

+0

@ StefanĐorđević Siehe [String.Join] (https://msdn.microsoft.com/en-us/library/system.string.join%28v=vs.110%29.aspx). –

+0

Kann es nicht 100% bekommen, aber danke trotzdem, ich habe getan, was ich brauchte! <3 –

1

Weil Sie in MatchCollection nur das erste Element zeigen, können Sie For Each Schleife verwenden, um alle Einzelteile so zeigen:

For Each item In doregex 
    MsgBox(item.ToString) 
Next 

Sie Artikel mit vielen Art und Weise kombinieren, belows einer von ihnen:

Dim result As String = String.Empty 
For Each item In doregex 
    result = String.Format("{0} {1}", result, item) 
Next 
MsgBox(result) 
+0

Ja, funktioniert ziemlich gut, aber kann es 1, 2 und 3 in kombinieren eine MsgBox, anstatt für jede neue zu öffnen? Danke –

+0

Sie können die Antwort sehen! –

0

Verwenden Sie LINQ:

Dim text_box_text = "<hello>1</hello>" & vbLf & "<hello>2</hello>" & vbLf & "<hello>3</hello>" 
Dim findtext As String = "(?<=<hello>)(.*?)(?=</hello>)" 
Dim my_matches_1 As List(Of String) = System.Text.RegularExpressions.Regex.Matches(text_box_text, findtext) _ 
            .Cast(Of Match)() _ 
            .Select(Function(m) m.Value) _ 
            .ToList() 
MsgBox(String.Join(vbLf, my_matches_1)) 

enter image description here

Auch mit diesem Code, brauchen Sie nicht die Ressourcen verbrauch lookarounds zu verwenden. Ändern Sie die Regex

Dim findtext As String = "<hello>(.*?)</hello>" 

und verwenden .Select(Function(m) m.Groups(1).Value) statt .Select(Function(m) m.Value).

Verwandte Themen