Regex findet optionale ZeichenIch habe Textzeichenfolgen, die wie folgt aussehen können: Str1 und Str2:
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
Es gibt also eine durch Kommas getrennte Liste von Werten, denen ein Schlüsselwort und ein Doppelpunkt vorangestellt sind. Auf die durch Kommas getrennte Liste können zusätzliche Variablen folgen oder nicht. Wenn dies der Fall ist, werden die durch Kommas getrennte Liste und die nachfolgenden Variablen durch Semikolons getrennt, wie in Str2 gezeigt.
Ich möchte die durch Kommas getrennte Liste abrufen. Ich habe den folgenden regulären Ausdruck ausprobiert
ParamLst1 = RegexMatch(Str2, "(ParamList:)(.*);?")[3];
ParamLst2 = RegexMatch(Str2, "(ParamList:)(.*);?")[3];
Ich denke, es wird "ParamList:" finden, dann wird (. *) Wenn Sie gierig sind, alles mit dem Ende des Strings übereinstimmen, aber es wird gesichert, bis es null oder ein Semikolon findet.
Ich muss falsch darüber nachdenken, da ich mit Str2 alles bis zum Ende des Strings zurückbringe ("Param1, Param2, Param3; Var2; Var3").
Ich kann das Wort Funktion verwenden, um mich zu retten:
word(1,ParamLst2 = RegexMatch(Str2, "(ParamList:)(.*)")[3],";");
und das funktioniert sowohl für Str1 als auch für Str2, erhöht aber die Komplexität, die ich sicher nicht brauche, wenn ich Regex ein wenig besser erfassen könnte!
Irgendwelche Ideen ?
SkriptingRe: Regex findet optionale ZeichenHier ist ein einfacher Brute-Force-Ansatz unter Verwendung der String-Funktionen von JSL.
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
s1 = substr(str1, 11);
w1 = words(s1, ";");
plist1 = words(w1[1], ",");
s2 = substr(str2, 11);
w2 = words(s2, ";");
plist2 = words(w2[1], ",");<BR />show(plist1, plist2);
Ausgabe:
plist1 = {"Param1", "Param2", "Param3"};
plist2 = {"Param1", "Param2", "Param3"};Re: Regex findet optionale ZeichenOder mit Regex
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
regex(Str2, "^([^:]*):([^;]*);?(.*)$", "part1='\1' part2='\2' part3='\3'" )
part1 = 'ParamList' part2 = 'Param1, Param2, Param3' part3 = ''
oder
part1 = 'ParamList' part2 = 'Param1, Param2, Param3' part3 = 'Var2; Var3'
Der Anfang ^ und das Ende $ erzwingen, dass der reguläre Ausdruck von Anfang bis Ende übereinstimmt. Das [^:] stimmt mit Zeichen überein, die nicht sind: und [^;] stimmt mit Zeichen überein, die nicht sind; . Der Einsame: überwindet das Erforderliche: und das ;? ist optional; .Das. * Entspricht den verbleibenden Zeichen, falls vorhanden.
Die Eltern bilden Gruppen. Die Gruppen werden im 3. Parameter als \ 1, \ 2 und \ 3 bezeichnet und in eine Zeichenfolge eingefügt, die das Ergebnis ergibt.
Beachten Sie, dass alle * -Operatoren so geschrieben sind, dass sie niemals "zu weit" gehen und gesichert werden müssen. Dies macht das Matching effizient. Verwenden Sie die negativen Zeichenklassen, wenn Sie können, um alles einem Trennzeichen zuzuordnen.
Die Ergebniszeichenfolge könnte "\ 2" sein, wenn das alles ist, was Sie wollen.