Perl:正则表达式:捕获组

时间:2017-12-28 04:37:28

标签: regex perl

在代码文件中,我想删除代码文本和结束{{1}之间的任何(一个或多个)连续的白线(可能只包含零个或多个空格/制表符然后换行的行)一个块。 <* 1}}这个结论可能在它之前有缩进空格,所以我想保留它们。

这是我尝试做的事情:

}

例如,如果我的代码文件看起来像(□是空格字符):

}

然后我希望它成为:

perl -i -0777 -pe 's/\s+\n([ ]*)\}/\n($1)\}/g' file

然而,它没有做我预期的改变。知道我在这里做错了吗?

4 个答案:

答案 0 :(得分:1)

perl -pi -0777 -e's/^\s*\n(?=\s*})//mg' yourfile

(从行的开头删除空行,通过行前面的换行符}作为第一个非空格。)

答案 1 :(得分:1)

我能用正则表达式看到的唯一问题是

  • 您不需要匹配变量周围的括号, 和
  • 在提取匹配时使用字符类 冗余(除非你想匹配制表符和空格)。

所以,你可以试试

s/\s+\n( *)\}/\n$1\}/g

代替。

在测试输入上运行时,这可以正常工作。

为了整理它,您可以尝试以下方法。

s/\s+(\n *\})/$1/g

如果可能有制表符和空格,则可以使用字符类。 (您不需要在字符类中包含“|”)。

s/\s+(\n[ \t]*\})/$1/g

答案 2 :(得分:0)

尝试使用此正则表达式,它使用正向前瞻断言。这样,您只捕获要删除的部分,然后将其替换为空:

s/\s+(?=\n[ ]*\})//g

答案 3 :(得分:-1)

您可以尝试以下一个班轮

perl -0777 -pe 's/\s*\n*(\s*\n)/$1/g' test