我有一堆文件都以注释块开头,例如:
/**
* @author AAA BBB
CCC DDDD
EEEE FFFF
* @date 2008-08-14
*/
有时只有一个作者行:
/**
* @author AAA BBB
* @date 2008-08-14
*/
我试图想出一个正则表达式,它将删除@author和@date之间的空行,但不会删除文件的其余部分。
我目前的情况:
(@author.*$)([\s\S]*)(^.*@date)
这当然不够,但我在那里插入一个(^ $)的尝试导致了错误的选择或无限循环。
正确的正则表达式是什么?
答案 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