开发者

Regex to convert a space separated list to a SQL where clause

开发者 https://www.devze.com 2022-12-19 06:47 出处:网络
I\'m almost开发者_StackOverflow embarassed, but I\'m struggling to create a regular expression to change something like cat dog mouse to a SQL where clause:

I'm almost开发者_StackOverflow embarassed, but I'm struggling to create a regular expression to change something like cat dog mouse to a SQL where clause:

a.cat=b.cat AND a.dog=b.dog AND a.mouse=b.mouse

With

s/(\w*)\s?/a.$1=b.$1 AND /

I get

a.cat=b.cat AND a.dog=b.dog AND a.mouse=b.mouse AND a.=b. AND

Ouch. Help appreciated.

EDIT: I ended up using two consecutive regexes. Since I needed this in a SAS macro and I wanted my code to be concise, I wrote this 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 /);

Thanks for all who replied!


Your first problem is you need + instead of *:

s/(\w+)\s?/a.$1=b.$1 AND /

This will solve the problem with a.=b..

Even then you will get an AND too much. You could solve this with a '1=1' at the end.

Are you sure you want to use regex here, and not a split, simple string manipulation, then a join? I think this would be simpler to understand.


You can split the line by spaces, perform s/^(.+)$/a.$1=b.$1/ (don't use regex for this simple situation though), then join the array with the "separator" "AND".

Make sure you trim the string before you start. The ending space is the reason for the extra a.=b..


You can do it with two regular expressions, one that matches everything but the first word, and one that matches the first.

C# code:

string where = "cat dog mouse";
where = Regex.Replace(where, @" (\w+)", " AND a.$1=b.$1");
where = Regex.Replace(where, @"^(\w+)", "a.$1=b.$1");


I can name that tune in 2 regular expressions!

str = prxchange('s/(\w+)/a.$1=b.$1/', -1, str);
str = prxchange('s/ +/ AND /', -1, str);
0

精彩评论

暂无评论...
验证码 换一张
取 消