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 auch 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 Gierig alles bis zum Ende der Zeichenfolge abgleichen, aber es wird gesichert, bis es null oder ein Semikolon findet.
Ich muss falsch darüber nachgedacht haben, denn mit Str2 bekomme ich alles zurück zum Ende der Zeichenfolge („Param1,Param2,Param3;Var2;Var3“).
Ich kann die Wortfunktion verwenden, um mich selbst 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 sicher unnötig ist, wenn ich Regex etwas besser verstehen könnte!
Irgendwelche Ideen ?
Erweiterte statistische ModellierungDatenmischung und -bereinigungBetreff: 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'" )
</CODE></P><P><STRONG>part1='ParamList' part2='Param1,Param2,Param3' part3=''</STRONG></P><P><STRONG>oder</STRONG></P><P><STRONG>part1='ParamList' part2='Param1,Param2,Param3' part3='Var2;Var3'</STRONG></P><P>Der Anfang ^ und das Ende $ erzwingen, dass die Regex vom Anfang bis zum Ende übereinstimmt. Das [^:] stimmt mit Zeichen überein, die nicht : sind, und [^;] stimmt mit Zeichen überein, die nicht ; . Das einsame : kommt über das erforderliche : und das ;? hinaus. ist ein optionales ; .Das .* stimmt mit den übrigen Zeichen überein, falls vorhanden.</P><P>Die Eltern bilden Fanggruppen. Die Gruppen werden im 3. Parameter als \1, \2 und \3 bezeichnet und in einen String eingefügt, der das Ergebnis ergibt.</P><P>Beachten Sie, dass alle *-Operatoren so geschrieben sind, dass sie nie „zu weit gehen“ und eine Sicherung erforderlich sind. Dies macht das Matching effizient. Verwenden Sie nach Möglichkeit die negativen Zeichenklassen, um alles bis auf ein Trennzeichen abzugleichen.</P><P>Die Ergebniszeichenfolge könnte „\2“ sein, wenn das alles ist, was Sie wollen.</P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-335077" slang="en-US" mode="NONE">Betreff: Regex findet optionale Zeichen</LINGO-SUB><LINGO-BODY id="lingo-body-335077" slang="en-US" mode="NONE"><P>Hier ist ein einfacher Brute-Force-Ansatz unter Verwendung der String-Funktionen von JSL.</P>
<PRE><CODE class=" language-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"};