时间:2011-08-04 09:49:22

标签: regex

我有一堆文件都以注释块开头,例如:

 /**
  * @author  AAA BBB
                             CCC DDDD

                       EEEE FFFF

  * @date    2008-08-14
  */

有时只有一个作者行:

 /**
  * @author  AAA BBB
  * @date    2008-08-14
  */

我试图想出一个正则表达式,它将删除@author和@date之间的空行,但不会删除文件的其余部分。

我目前的情况:

(@author.*$)([\s\S]*)(^.*@date)

这当然不够,但我在那里插入一个(^ $)的尝试导致了错误的选择或无限循环。

正确的正则表达式是什么?

3 个答案:

答案 0 :(得分:1)

我不知道您将使用哪种环境/工具/语言,但这些行中的某些内容应该可以解决问题 - 在Vi / sed中(未测试)

\/\*.*\([\*\t\s\S\n\r]*\)\(@author.*\).*\([\*\t\s\S\n\r]*\).*\(@date.*).*\*/\

这就是它的含义:

查找以/ *开头的字符串后面可以跟任何字符。它可能包含任何空格,直到它再次遇到'@author',字符/空格,然后'@date'以其他字符结尾并以* /

结束

你基本上想做“子串”regexing(如果它甚至是一个词) - 寻找一个大的模式并在其中提取子模式(由\(和\)划分 - 转义圆括号。

然后,您可以像\ 1 \ 2那样在位置上引用表达式,依此类推。基本上是子串\(... \)你要保留的所有内容,最后只需要使用\ 1 \ 2等替换,只要这种模式不会在其他地方重复,这应该可以正常工作:)

希望这会有所帮助。它可能不是“完美的”正则表达式,但你可以了解如何构造它并提取子串......

答案 1 :(得分:1)

在JEdit中,我终于通过使用以下正则表达式得到了我想要的东西:

(@author.*)([\s\S]*)(^$\n)( \* @date.*)

,替换字符串是

$1$2$4

答案 2 :(得分:1)

如果您安装了vim且每个文件只出现@author@date个标签,则可以执行以下操作:

vim -e '/@author/,/@date/v:.:d' -e 'x' FILE

如果您有多个文件,则应使用:

vim -e 'buffdo!/@author/,/@date/v:.:d' -e 'xa' FILES

Vim将打开文件,然后搜索blockrange,然后搜索空行(单个空格不是空行!),然后删除它们并写入文件并退出。

HTH