缺少功能PRXMATCH的SAS参数1

时间:2016-03-28 14:30:00

标签: regex sas

当我运行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;

2 个答案:

答案 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;