1

我几乎感到尴尬,但我正在努力创建一个正则表达式来更改类似于cat dog mouseSQL 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 /);

感谢所有回复的人!

4

4 回答 4

3

你的第一个问题是你需要+而不是*

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

这将解决问题a.=b.

即使那样你也会得到AND太多。你可以在最后用 '1=1' 来解决这个问题。

您确定要在此处使用正则表达式,而不是拆分、简单的字符串操作,然后是连接吗?我认为这会更容易理解。

于 2010-02-01T14:25:48.673 回答
2

您可以用空格分隔行,执行s/^(.+)$/a.$1=b.$1/(尽管在这种简单情况下不要使用正则表达式),然后使用“分隔符”“”加入数组AND

确保在开始之前修剪字符串。结束空间是额外的原因a.=b.

于 2010-02-01T14:27:09.433 回答
1

我可以用 2 个正则表达式命名那个曲调!

str = prxchange('s/(\w+)/a.$1=b.$1/', -1, str);
str = prxchange('s/ +/ AND /', -1, str);
于 2010-02-01T14:38:19.173 回答
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");
于 2010-02-01T14:39:25.613 回答