【问题标题】:How can I negate a regular expression?如何否定正则表达式?
【发布时间】:2019-10-28 12:22:36
【问题描述】:

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

案例1:当前一个节点不是*_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,但这不起作用

【问题讨论】:

  • 我不懂这种语言,但你不能用正则表达式测试一个正匹配然后否定结果。
  • @JGNI 同上。 if l1 matches *_pcm.h then whatever else we have path to l2

标签: regex rascal clair


【解决方案1】:

您不能直接在模式内表达这种否定,但这里有一个解决方法,在您正在转换的情况下向案例添加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失败。

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

希望这能解决您的问题。

【讨论】:

  • 我得到了如下期望的行为:case \sources(, "_SOURCES", [*, l1:\sourceList(, _, _, p, _, _), l2:\sourceList(, , _, n:/_pcm.c/i, _, _), *]): { if (/pcm.h /i !:= p) { 路径 = getPath(f); } else { 名称 = 确定路径(p,n,f); }
猜你喜欢
  • 2013-01-18
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多