Perl:正则表达式:捕获组

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

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

这是我尝试做的事情:

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

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

□□□□while (true) {\n
□□□□□□□□print("Yay!");□□□□□□\n
□□□□□□□□□□□□□□□□\n
□□□□}\n

然后我希望它成为:

□□□□while (true) {\n
□□□□□□□□print("Yay!");\n
□□□□}\n

但是它没有做我预期的改变。知道我在这里做错了什么吗?

regex perl
4个回答
1
投票

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

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

所以,你可以试试

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

代替。

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

要进一步整理,您可以尝试以下方法。

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

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

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

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

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


0
投票

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

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

-1
投票

您可以尝试以下一个班轮

perl -0777 -pe 's/\s*\n*(\s*\n)/$1/g' test
© www.soinside.com 2019 - 2024. All rights reserved.