Regex che trova caratteri opzionaliHo stringhe di testo che possono assomigliare a Str1 e Str2 di seguito:
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
Quindi c'è un elenco di valori delimitati da virgole con prefisso una parola chiave e due punti. L'elenco delimitato da virgole potrebbe essere seguito o meno da variabili aggiuntive. In tal caso, l'elenco delimitato da virgole e le variabili successive verranno separati da punto e virgola come mostrato in Str2.
Voglio prendere l'elenco delimitato da virgole. Ho provato la seguente regex
ParamLst1 = RegexMatch(Str2, "(ParamList:)(.*);?")[3];
ParamLst2 = RegexMatch(Str2, "(ParamList:)(.*);?")[3];
Penso che troverà "ParamList:" quindi (.*) essendo avido abbinerà tutto fino alla fine della stringa, ma eseguirà il backup finché non troverà zero o un punto e virgola.
Devo pensarci male, dato che con Str2 riporto tutto alla fine della stringa ("Param1,Param2,Param3;Var2;Var3")
Posso usare la funzione verbale per salvarmi:
word(1,ParamLst2 = RegexMatch(Str2, "(ParamList:)(.*)")[3],";");
e questo funziona sia per Str1 che per Str2, ma aggiunge complessità che sono sicuro non sarebbe necessaria se potessi cogliere l'espressione regolare un po' meglio!
Qualche idea ?
Modellazione statistica avanzataCombinazione e pulizia dei datiRe: Regex che trova caratteri opzionaliOppure, usando 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='ListaParam' part2='Param1,Param2,Param3' part3=''</STRONG></P><P><STRONG>O</STRONG></P><P><STRONG>part1='ListaParam' part2='Param1,Param2,Param3' part3='Var2;Var3'</STRONG></P><P>L'inizio ^ e la fine $ forzano la regex a corrispondere dall'inizio alla fine. [^:] corrisponde a caratteri che non sono : e [^;] corrisponde a caratteri che non sono ; . Il solitario: supera il richiesto: e il ;? è un facoltativo; .Il .* corrisponde ai caratteri rimanenti, se presenti.</P><P>I genitori creano gruppi di cattura. I gruppi vengono indicati nel terzo parametro come \1, \2 e \3 e inseriti in una stringa che costituisce il risultato.</P><P>Tieni presente che tutti gli operatori * sono scritti in modo che non vadano mai "troppo lontano" e necessitino di eseguire il backup. Ciò rende l'abbinamento efficiente. Usa le classi di caratteri negativi quando puoi per abbinare tutto fino a un delimitatore.</P><P>La stringa del risultato potrebbe essere "\2" se è tutto ciò che desideri.</P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-335077" slang="en-US" mode="NONE">Re: Regex che trova caratteri opzionali</LINGO-SUB><LINGO-BODY id="lingo-body-335077" slang="en-US" mode="NONE"><P>Ecco un semplice approccio di forza bruta che utilizza le funzioni stringa di 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);
Produzione:
plist1 = {"Param1", "Param2", "Param3"};
plist2 = {"Param1", "Param2", "Param3"};