2016-08-08 11 views
1

Im Moment habe ich die Zeichenfolge:C# gierig regulären Ausdruck einschließlich Match Text

"CL,UP_REMOVE_LINE,#global_session_id,arg_stage=false,arg_project_id=-1,#global_line_id,arg_activity_id=-1,arg_mode=1,arg_line_id=#global_line_id,arg_session_id=-1" 

Ich habe versucht:

splitty = Regex.Split(lineText,@"[\,]+\s*(?>arg_){1}?"); 

und erhalten:

{string[7]} 
    [0]: "CL,UP_REMOVE_LINE,#global_session_id" 
    [1]: "stage=false" 
    [2]: "project_id=-1,#global_line_id" 
    [3]: "activity_id=-1" 
    [4]: "mode=1" 
    [5]: "line_id=#global_line_id" 
    [6]: "session_id=-1" 

I Spaltung bin durch mindestens eine Komma, gefolgt von willkürlichem Leerraum, gefolgt vom "arg_" -Trennzeichen, aber gibt es eine Möglichkeit, den "arg_" -Anteil intakt zu halten, dh Indices [1-6]?

Antwort

1

Verwenden Sie eine positive Vorschau (zu überprüfen, um die Anwesenheit von, aber nicht verbrauchen, damit es in den geteilten Stücken verlassen) statt einer Atomgruppe (das noch verbraucht wird, und somit entfernt wird, wenn Split verwendet):

,+\s*(?=arg_) 

Siehe regex demo

Hinweis Sie nicht das Komma in einer Zeichenklasse setzen müssen, noch müssen Sie das Komma entkommen.

enter image description here

Auch {1}? = {1} und ist völlig redundant (Sie es immer entfernen, da diese {1} immer impliziert ist (das heißt abc = a{1}b{1}c{1})).

+0

Perfekt, danke. Meine gierige Lösung wird also nicht funktionieren, weil sie konsumiert, was sie zusammenbringt. Ich war unter der gegenteiligen Annahme auf 'Nonbacktracking (oder "gierigen") Teilausdruck' Eintrag von https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx wo [13579] ((A + B +) ergibt "1ABB", "3ABB" und "5AB" in "1ABB 3ABBC 5AB 5AC". Können Sie in diesem Fall erklären, warum die gierige Lösung das Gegenteil unserer gegenwärtigen Annahme zu tun scheint? – Rice

+1

Atomare Gruppen "schalten" nur die Rückverfolgung in einen Teilausdruck ab, sie stimmen immer noch überein und konsumieren Text, während Blickwinkel die Zeichen nicht konsumieren, sie prüfen nur das Vorhandensein oder Fehlen eines Textes vor oder nach der aktuellen Position * ohne * den Index zu verschieben . Siehe [* Mastering Lookahead und Lookbehind *] (http://www.rexegg.com/regex-lookarounds.html): * Es ist, dass am Ende eines Lookahead oder eines Lookbehind, die Regex-Engine nicht auf der verschoben wurde Zeichenfolge. Sie können drei weitere Lookaheads nach dem ersten verketten, und die Regex-Engine bewegt sich immer noch nicht. * –

Verwandte Themen