Regex che trova caratteri opzionaliHo stringhe di testo che possono apparire come Str1 e Str2 di seguito:
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
Quindi c'è un elenco di valori delimitato da virgole con prefisso una parola chiave e due punti. L'elenco delimitato da virgole potrebbe o non potrebbe essere seguito da variabili aggiuntive. In caso affermativo, l'elenco delimitato da virgole e le variabili successive saranno separate da punti 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 corrisponderà a tutto fino alla fine della stringa, ma eseguirà il backup finché non trova zero o un punto e virgola.
Devo pensarci male, dato che con Str2 rimetto tutto alla fine della stringa ("Param1, Param2, Param3; Var2; Var3")
Posso usare la parola funzione 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 sia necessario se potessi capire un po 'meglio le espressioni regolari!
Qualche idea ?
ScriptingRi: Regex trovare caratteri opzionaliEcco un semplice approccio di forza bruta che utilizza le funzioni stringa di 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"};Ri: Regex trovare caratteri opzionaliOppure, usando 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 = ''
o
part1 = 'ParamList' part2 = 'Param1, Param2, Param3' part3 = 'Var2; Var3'
L'inizio ^ e la fine $ costringono la regex a trovare una corrispondenza dall'inizio alla fine. [^:] Corrisponde a caratteri che non lo sono: e [^;] corrisponde a caratteri che non lo sono; . Il solitario: supera il richiesto: e il;? è un optional; .Il. * Corrisponde ai caratteri rimanenti, se presenti.
I genitori creano gruppi di cattura. I gruppi sono indicati nel 3 ° parametro come \ 1, \ 2 e \ 3 e inseriti in una stringa che produce il risultato.
Nota che tutti gli operatori * sono scritti in modo da non andare mai "troppo in là" e necessitano di backup. Ciò rende la corrispondenza efficiente. Usa le classi di caratteri negativi quando puoi per abbinare tutto fino a un delimitatore.
La stringa del risultato potrebbe essere "\ 2" se è tutto quello che vuoi.