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

问题描述 投票:0回答:1

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

我正在访问以查找匹配项并替换它们,以便删除空行。但是结果不是我所期望的。代码如下:

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

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

有人可以解释我在使用正则表达式以及下面显示的表达式时出了什么问题吗?我似乎无法弄清楚为什么它不起作用。

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

亲切的问候,

鲍勃

rascal
1个回答
0
投票

[我认为这里最大的问题是,在visit的上下文中,^锚并不表示您认为的那样。参见以下示例:

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

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

要解决此问题,请仅使用for匹配作为条件,而不要使用while循环或:=

© www.soinside.com 2019 - 2024. All rights reserved.