2010-02-01 3 views
1

Я почти смущен, но я изо всех сил, чтобы создать регулярное выражение, чтобы изменить что-то вроде cat dog mouse к SQL, где положение:Regex для преобразования разделенных пробелами список в 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 

Ouch. Помогите оценить.

EDIT: В итоге я использовал два последовательных регулярных выражения. Так как мне нужно было это в макросе 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 /); 

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

+0

Что реализации языка вы используете? –

+0

@Paul, я использую функции регулярного выражения SAS, которые используют синтаксис Perl –

ответ

3

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

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

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

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

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

+0

Спасибо, я могу разделить манипуляции на несколько частей. Но с точки зрения обучения было бы неплохо узнать, можно ли/как это сделать с помощью одного регулярного выражения. –

+0

Не в порядке. Проблема в том, что вы должны заменить три слова, но только два пробела между словами. Вы можете сделать это, если используете два отдельных регулярных выражения, одно из которых преобразует слова, а другое - для преобразования пробелов между словами. Но это не одно регулярное выражение, и оно менее эффективно, чем любое другое решение, которое я предложил. –

2

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

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

+0

+1 для предложения не использовать регулярное выражение: RegEx являются мощными, но часто есть более простые (и обычно более быстрые) способы добраться до цели, чем сложные RegEx, такие как split() и join(). – dbemerlin

1

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

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

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

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");