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!

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top