Regex para converter uma lista separada por espaço em uma cláusula SQL onde
Pergunta
Estou quase envergonhado, mas estou lutando para criar uma expressão regular para mudar algo como cat dog mouse
Para um SQL onde a cláusula:
a.cat=b.cat AND a.dog=b.dog AND a.mouse=b.mouse
Com
s/(\w*)\s?/a.$1=b.$1 AND /
eu recebo
a.cat=b.cat AND a.dog=b.dog AND a.mouse=b.mouse AND a.=b. AND
Ai. Ajuda apreciado.
EDITAR: Acabei usando duas regexes consecutivas. Como eu precisava disso em uma macro SAS e queria que meu código fosse conciso, escrevi esta 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 /);
Obrigado por todos que responderam!
Solução
Seu primeiro problema é que você precisa +
ao invés de *
:
s/(\w+)\s?/a.$1=b.$1 AND /
Isso resolverá o problema com a.=b.
.
Mesmo assim você terá um AND
muito. Você pode resolver isso com um '1 = 1' no final.
Tem certeza de que deseja usar o Regex aqui, e não uma manipulação simples e dividida de cordas, depois uma junção? Eu acho que isso seria mais simples de entender.
Outras dicas
Você pode dividir a linha por espaços, execute s/^(.+)$/a.$1=b.$1/
(Não use Regex para esta situação simples), então Junte a matriz com o "separador" "AND
".
Assegure-se de que você aparar a string antes de começar. O espaço final é o motivo do extra a.=b.
.
Você pode fazer isso com duas expressões regulares, uma que corresponde a tudo, exceto a primeira palavra, e uma que corresponde à primeira.
Código C#:
string where = "cat dog mouse";
where = Regex.Replace(where, @" (\w+)", " AND a.$1=b.$1");
where = Regex.Replace(where, @"^(\w+)", "a.$1=b.$1");
Eu posso citar essa música em 2 expressões regulares!
str = prxchange('s/(\w+)/a.$1=b.$1/', -1, str);
str = prxchange('s/ +/ AND /', -1, str);