用于删除空行的正则表达式会产生错误的结果

regular expression for removing empty lines produces wrong results

有人可以帮我解决我在使用正则表达式时遇到的问题吗?我有一个包含以下代码的文件:

我正在使用访问来查找匹配项并替换它们,以便我可以删除空行。然而,结果并不是我所期待的。代码如下:

str content = readFile(location);
// Remove empty lines
content = visit (content) {
    case /^[ \t\f\v]*?$(?:\r?\n)*/sm => ""
}

此正则表达式还会删除非空行,导致输出等于:

谁能解释一下我在使用正则表达式以及下面显示的表达式时做错了什么?我似乎无法弄清楚为什么它不起作用。

str content = readFile(location);
// Remove empty lines
content = visit (content) {
    case /^\s+^/m => ""
}

亲切的问候,

鲍勃

我认为这里的大问题是,在 visit 的上下文中,^ 锚并不代表您认为的那样。看这个例子:

rascal>visit ("aaa") { case /^a/ : println("yes!"); }
yes!
yes!
yes!
  • 访问匹配字符串每个后缀的正则表达式,因此 ^ 是每个后缀的相对值。
  • 它首先从 "aaa" 开始,然后是 "aa",然后是 "a"。

在您的示例访问中,将发生的是行的空后缀也将匹配您的正则表达式,并用空字符串替换它们。我觉得还有一个效果就是马车return不会被急切吃掉

要解决此问题,只需不使用访问,而是使用 for 循环或 while,并以 := 匹配作为条件。