2010-02-01 97 views
1

我几乎不好意思一个SQL,但我在努力创建一个正则表达式来改变像cat dog mouse到SQL where子句:正则表达式转换空格分隔列表,where子句

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

谢谢所有回复!

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