Regex per convertire una lista separata da spazi ad una clausola SQL where
Domanda
Sono quasi imbarazzato, ma sto lottando per creare un'espressione regolare per cambiare qualcosa di simile ad un cat dog mouse
SQL clausola WHERE:
a.cat=b.cat AND a.dog=b.dog AND a.mouse=b.mouse
Con
s/(\w*)\s?/a.$1=b.$1 AND /
ho
a.cat=b.cat AND a.dog=b.dog AND a.mouse=b.mouse AND a.=b. AND
Ouch. Aiuto apprezzato.
Modifica Ho finito per usare due espressioni regolari consecutivi. Da quando ho bisogno di questo in una macro SAS e volevo il mio codice di essere concisi, ho scritto questa macro:
%Macro rxchange(str,rx1,rx2,rx3,rx4,rx6,rx7,rx8,rx9,rx10);
%Let rxno=1;
%Do %While("&&rx&rxno" Ne "");
%Let str=%SysFunc(PRXChange(%Str(&&rx&rxno), -1, %Str(&str)));
%Let rxno=%Eval(&rxno+1);
%End;
&str
%Mend;
/* Try this: */
%Put %rxchange(cat dog mouse,s/(\w+)\s?/a.$1=b.$1 /,s/(\s+)/ AND /);
Grazie per tutti coloro che hanno risposto!
Soluzione
Il primo problema è che è necessario +
invece di *
:
s/(\w+)\s?/a.$1=b.$1 AND /
Questo risolverà il problema con a.=b.
.
Anche allora si otterrà un AND
troppo. Si potrebbe risolvere questo con un '1 = 1' alla fine.
Sei sicuro che si desidera utilizzare regex qui, e non una spaccatura, semplice manipolazione di stringhe, quindi un join? Credo che questo sarebbe più semplice da capire.
Altri suggerimenti
Puoi Spalato la linea da spazi, eseguire s/^(.+)$/a.$1=b.$1/
(non usare espressioni regolari per questo semplice situazione però), quindi unirsi la matrice con il "separatore" " AND
".
Assicurati di tagliare la stringa prima di iniziare. Lo spazio finale è la ragione per la a.=b.
supplementare.
Si può farlo con due espressioni regolari, uno che corrisponde tutto, ma la prima parola, e uno che corrisponde al primo.
C # codice:
string where = "cat dog mouse";
where = Regex.Replace(where, @" (\w+)", " AND a.$1=b.$1");
where = Regex.Replace(where, @"^(\w+)", "a.$1=b.$1");
posso per riconoscere i brani in 2 espressioni regolari!
str = prxchange('s/(\w+)/a.$1=b.$1/', -1, str);
str = prxchange('s/ +/ AND /', -1, str);