SAS PRXPARSE模式优先级

时间:2018-08-08 20:54:56

标签: regex sas

我有以下情况。

字符串有许多模式。我需要找到并选择一个。我有一个PRXPARSE,它将找到任何给定的模式。它返回第一个匹配的模式。我希望能够设定优先级。即扫描整个字符串以查找模式1,如果发现停止并返回,则扫描字符串以查找模式2等等。

这是当前代码:

True

这是当前输出: 目标TEST_STR

i=5

让我说我需要模式bbb来具有优先级,以便第三行'aaa bbb'返回'bbb'而不是'aaa'

具有多个PRXPARSE语句的短语句,并且仅在前一个失败的情况下才调用下一个,我如何使它工作?

谢谢 本

1 个答案:

答案 0 :(得分:2)

为清楚起见,正在做什么,我将区分优先顺序的模式匹配步骤分开。

正则表达式交替运算符|本质上是用于匹配条件的or运算符。在正则表达式模式匹配中,默认目标字符串扫描从左到右执行。这两个事实意味着默认行为将返回第一个匹配条件的位置,从而返回您的问题。

对于优先匹配尝试,我建议使用select语句

data want;
  set have;

  rx1 = prxparse ("/\b(bbb)\b/"); /* bbb as a word (\b) is first priority */
  rx2 = prxparse ("/\b(aaa)\b/"); /* aaa as a word (\b) is second priority */

  select;
    when (prxmatch(rx1, target)) matched_with = prxposn(rx1,1,target);
    when (prxmatch(rx2, target)) matched_with = prxposn(rx2,1,target);
    otherwise matched_with = '*no match*';
  end;

  drop rx:;
run;

使用单个复杂的模式可能 可以实现优先定位,但是对它进行编码的好处并不像维护清晰易懂的代码库那么重要。复杂的模式可能涉及反向的前瞻性表达。