当我运行prxmatch时,我不断收到错误消息,说缺少参数1。我检查了模式并且它正确处理,但是当我尝试通过SAS使用它时,我得到以下错误。
以下是返回WORD_0012_MUK613
N
data test2;
set test;
if prxmatch(prxparse('^WORD_\d{4}_\w{3}\d{3}$'), external_id) then match = 'Y'; else match = 'N';
run;
注意:缺少函数PRXMATCH的参数1。
错误:函数PRXMATCH的参数1必须是PRXPARSE为有效模式返回的正整数。
错误:在正则表达式“^ WORD_ \ d {4} _ \ w {3} \ d {3} $”之后找不到关闭分隔符“^”。
错误:传递给函数PRXPARSE的正则表达式包含语法错误。
当我添加分隔符时,它会消除错误但仍然不匹配
data test2;
set test;
if prxmatch(prxparse('/^COAF_\d{4}_\w{3}\d{3}$/'), external_id) then match = 'Y'; else match = 'N';
run;
答案 0 :(得分:1)
不需要PRXPARSE功能,还需要表达式示例/ exp /
的分隔符drawable-hdpi
答案 1 :(得分:1)
首先,prxparse
存在,允许您将正则表达式的编译与其使用分开。这对代码结构很有用。但是,它在你使用它的方式上并没有什么用处 - 嵌套它。
data test2;
set test;
rx_word = prxparse('^WORD_\d{4}_\w{3}\d{3}$');
if prxmatch(rx_word, external_id) then match = 'Y'; else match = 'N';
run;
其次,您需要SAS中的分隔符来包装正则表达式(这将在步骤3中有用)。任何角色都没问题 - 你传递它的第一个角色将成为分隔符,所以使用你不会在除分隔符之外的任何地方使用的东西。 /
很常见,但我有时会使用~
,因为正则表达式中可能需要/
,并且必须进行转义。
data test2;
set test;
rx_word = prxparse('~^WORD_\d{4}_\w{3}\d{3}$~');
if prxmatch(rx_word, external_id) then match = 'Y'; else match = 'N';
run;
第三,你需要一些选择。至少o
- 这样,正则数据集的每一行都不会编译一次,这非常慢。 i
表示不区分大小写。 s
表示忽略字符串中的换行符,如果相关的话。他们追踪结束分隔符 - 因此,需要它们(尽管即使你没有使用任何选项,它们也不是可选的)。
data test2;
set test;
rx_word = prxparse('~^WORD_\d{4}_\w{3}\d{3}$~o');
if prxmatch(rx_word, external_id) then match = 'Y'; else match = 'N';
run;
第四,SAS字符串是全长(非varchar)字符串。如果你的字符串后面有空格,你将得不到匹配。因此,如果您包含字符串标记的$
结尾,并且不是100%确定您的字符串不是精确的长度,那么请确保在匹配它们时修剪字符串(或者使用substr
或其他东西来获得确切的长度。)
data test2;
set test;
rx_word = prxparse('~^WORD_\d{4}_\w{3}\d{3}$~o');
if prxmatch(rx_word, trim(external_id)) then match = 'Y'; else match = 'N';
run;
最后,您可以使用ifc
改进最后一个语句,因为prxmatch返回0表示不匹配。
完整的例子:
data test;
length external_id $20;
input external_id $;
datalines;
WORD_0012_MUK613
WORD_5344_915ABC
;;;;
run;
data test2;
set test;
rx_word = prxparse('~^WORD_\d{4}_\w{3}\d{3}$~o');
match = ifc(prxmatch(rx_word, trim(external_id)),'Y','N');
put match=;
run;