首页 > 解决方案 > 删除空行的正则表达式会产生错误的结果

问题描述

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

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

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 => ""
}

亲切的问候,

鲍勃

标签: rascal

解决方案


我认为这里的大问题是,在 的上下文中visit^锚并不意味着你认为它的作用。看这个例子:

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

在您的示例访问中,将发生的情况是行的空后缀也将匹配您的正则表达式,并用空字符串替换它们。我认为另一个效果是回车没有被急切地吃掉。

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


推荐阅读