Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex将空格分隔的列表转换为SQLWHERE子句_Sql_Regex_Sas_Sas Macro - Fatal编程技术网

Regex将空格分隔的列表转换为SQLWHERE子句

Regex将空格分隔的列表转换为SQLWHERE子句,sql,regex,sas,sas-macro,Sql,Regex,Sas,Sas Macro,我几乎感到尴尬,但我正在努力创建一个正则表达式,以将类似于猫-狗-鼠标的内容更改为SQL where子句: a.cat=b.cat AND a.dog=b.dog AND a.mouse=b.mouse 与 我明白了 哎哟。谢谢你的帮助 编辑:我最后使用了两个连续的正则表达式。由于我需要在SAS宏中使用该宏,并且我希望代码简洁,因此我编写了以下宏: %Macro rxchange(str,rx1,rx2,rx3,rx4,rx6,rx7,rx8,rx9,rx10); %Let rxno=

我几乎感到尴尬,但我正在努力创建一个正则表达式,以将类似于
猫-狗-鼠标
的内容更改为SQL where子句:

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

我明白了

哎哟。谢谢你的帮助

编辑:我最后使用了两个连续的正则表达式。由于我需要在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 /);

谢谢所有的回复

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

s/(\w+)\s?/a.$1=b.$1 AND /
这将解决
a.=b.
的问题

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


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

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

s/(\w+)\s?/a.$1=b.$1 AND /
这将解决
a.=b.
的问题

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


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

您可以按空格拆分行,执行
s/^(+$/a.$1=b.$1/
(不过不要在这种简单的情况下使用regex),然后使用“分隔符”
”连接数组


开始之前,请确保修剪字符串。结尾的空格是额外的
a.=b.

的原因。您可以按空格拆分行,执行
s/^(.+)$/a.$1=b.$1/
(不过在这种简单的情况下不要使用regex),然后用“分隔符”
连接数组


开始之前,请确保修剪字符串。结尾空格是额外的
a.=b.

的原因,我可以在2个正则表达式中命名它

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

我可以在2个正则表达式中命名这首曲调

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

您可以使用两个正则表达式来实现这一点,一个匹配除第一个单词以外的所有内容,另一个匹配第一个单词

C#代码:


您可以使用两个正则表达式来实现这一点,一个匹配除第一个单词以外的所有内容,另一个匹配第一个单词

C#代码:


您使用的是什么实现语言?@Paul,我使用的是SAS正则表达式函数,它使用Perl语法。您使用的是什么实现语言?@Paul,我使用的是SAS正则表达式函数,它使用Perl语法。谢谢,我可以将操作分为几个部分。但是从学习的角度来看,如果能知道是否/如何使用单个regexNot以任何好的方式完成这项工作,那就太好了。问题是你必须替换三个单词,但是单词之间只有两个空白。如果您使用两个单独的正则表达式,一个用于转换单词,另一个用于转换单词之间的间距,则可以实现这一点。但这不是一个单一的正则表达式,而且它的效率比我建议的其他任何一个解决方案都要低。谢谢,我可以将操作分为几个部分。但是从学习的角度来看,如果能知道是否/如何使用单个regexNot以任何好的方式完成这项工作,那就太好了。问题是你必须替换三个单词,但是单词之间只有两个空白。如果您使用两个单独的正则表达式,一个用于转换单词,另一个用于转换单词之间的间距,则可以实现这一点。但这不是一个单一的正则表达式,而且它的效率比我建议的其他任何一个解决方案都要低。+1对于不使用正则表达式的建议:正则表达式功能强大,但通常比复杂的正则表达式更容易(通常更快)到达目标,如split()和join()在本例中,+1建议不要使用正则表达式:正则表达式功能强大,但通常比复杂正则表达式更容易(通常更快)到达目标,如本例中的split()和join()。
string where = "cat dog mouse";
where = Regex.Replace(where, @" (\w+)", " AND a.$1=b.$1");
where = Regex.Replace(where, @"^(\w+)", "a.$1=b.$1");