Regex для преобразования списка, разделенного пробелами, в выражение SQL where - PullRequest
1 голос
/ 01 февраля 2010

Я почти смущен, но я изо всех сил пытаюсь создать регулярное выражение, чтобы изменить что-то вроде cat dog mouse на SQL-выражение:

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

С

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

Я получаю

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

Уч. Помощь оценена.

РЕДАКТИРОВАТЬ: Я закончил с использованием двух последовательных регулярных выражений. Так как я нуждался в этом в макросе SAS и хотел, чтобы мой код был кратким, я написал этот макрос:

%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 /);

Спасибо всем, кто ответил!

Ответы [ 4 ]

3 голосов
/ 01 февраля 2010

Ваша первая проблема - вам нужно + вместо *:

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

Это решит проблему с a.=b..

Даже тогда вы получите AND слишком много.Вы можете решить это с помощью «1 = 1» в конце.

Вы уверены, что хотите использовать регулярное выражение здесь, а не простое манипулирование с разбиением строк, а затем соединение?Я думаю, что это было бы проще понять.

2 голосов
/ 01 февраля 2010

Вы можете разделить строку по пробелам, выполнить s/^(.+)$/a.$1=b.$1/ (не используйте регулярное выражение для этой простой ситуации), затем объедините массив с разделителем AND».

Убедитесь, что вы обрезаете строку перед началом. Конечный пробел является причиной дополнительного a.=b..

1 голос
/ 01 февраля 2010

Вы можете сделать это с помощью двух регулярных выражений, одно из которых соответствует всему, кроме первого слова, и другое, соответствующее первому.

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");
1 голос
/ 01 февраля 2010

Я могу назвать эту мелодию в 2-х регулярных выражениях!

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