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!

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top