Rascal 中参数化正则表达式与文字正则表达式的行为有区别吗?

Is there a difference in behavior of parameterized vs. literal regular expressions in Rascal?

我正在研究一种接受正则表达式和字符串来检查此表达式的方法。

public bool match_case_insensitive(str regexp, str toMatch)
{
    bool match = /<regexp>/i := toMatch;
    if(match) println(toMatch);
    return match;
}

假设以下正则表达式:(.*[e]){2},它匹配任何至少有两个 e 的字符串。假设要检查以下字符串:merely

调用 match_case_insensitive("(.*[e]){2}", "merely") 将 return false

在终端中评估表达式将产生 true:/(.*[e]){2}/ := "merely" returns bool:true 并且 /(.*[e]){2}/i := "merely" 在不区分大小写时也是如此。

我希望我的函数中的 /<regexp>/i 计算结果为 /(.*[e]){2}/i 但这显然不是真的。 运行 终端中的原始比较与使用此方法之间的假定区别是什么?我认为 Rascal 不支持捕获组,因为我在文档中找不到它。我能想到的另一个原因是 Rascal 转义了所有字符串字符,因此字符串永远不可能真正包含包含元字符的正则表达式。

  1. 你推断正确,在插值时间 Rascal 将转义元字符(我希望所有字符)所以你不能动态构造正则表达式。所以 regex=".";//:= "bla" 会在编译正则表达式之前扩展为 /\./ := "bla"
  2. 该表示法确实支持使用此表示法捕获组 <name: regex>

    无赖>if (// := "aaabbb")

    >>>>>println(" - ");

    aaa - bbb