如何否定正则表达式?

How can I negate a regular expression?

我想知道一个字段是否与某个字符串不匹配:

情况一:当前一个节点不是*_pcm.h,则l1给出文件路径l2.

案例2:当没有l1或者案例1不成立时,那么l就是我需要的

visit(sec) {
  // case 1
  case \sources(_, "_SOURCES", [*_, l1:\sourceList(_, _, _, p:/_pcm.h/i, _, _),
                l2:\sourceList(_, _, _, n:/_pcm.c/i, _, _), *_]): { 
                    name = determinePath(p, n, f); 
  }
  // case 2
  case \sources(_, "_SOURCES", [*_,  l:\sourceList(_, _, _, n:/_pcm.c/i, _, _) , *_]): {
                    path = getPath(f); 
  }
}

我尝试了 p:!/_pcm.h/i 而不是 p:/_pcm.h/i,但这不起作用

您不能直接在模式中表达这种否定,但这里有一个解决方法,即在您要转换的情况下向案例添加 when 条件(即,在模式之间使用 =>和行动):

data D = d1(str s) | d2(int n);

D transform(D subject){
    return visit(subject){
                case d1(str s) => d1(s + s) when /abc/ !:= s
    }
}

在比较复杂的情况下,你可以测试并使用fail让案例失败。

case d1(str s): { if(/abc/ !:= s) fail; ... }

希望这能解决您的问题。