如何使用Notepad ++(正则表达式)选择注释之间的所有代码

时间:2010-11-02 19:36:22

标签: regex notepad++ replace

我正在尝试在两个评论标签之间选择一个代码块,如下所示:

<!-- begin answers -->
   ...[code]
<!-- end answers -->

我尝试了类似<!-- begin answers -->.*<!-- end answers -->的内容,但我的正则表达式知识相当有限。我对Notepad ++的查找和替换的了解非常有限,但我使用它的原因是因为“替换打开文件”选项被认为是非常有用的。这是因为我正在对大约4000个文件进行搜索/替换。

这些注释之间的代码可能会有所不同(空格,空格),所以我需要一些灵活的东西来处理它。

谢谢!

5 个答案:

答案 0 :(得分:3)

你试过的正则表达式应该可以工作但不幸的是,Notepad ++使用的正则表达式引擎(Scintilla)无法在新行中匹配。所以没有办法做到这一点。 此限制记录在案here。它也只支持非常基本的表达式。而且你不能只选择注释之间的文本(也不能选择注释),因为不支持前瞻和后面的断言。

答案 1 :(得分:1)

你可以使用自Notepad ++ v~6.0 +:

搜索:(?<=<!-- begin answers -->\r?\n).*?(?=<!-- end answers -->)

这将突出显示<!-- begin answers -->\r?\n<!-- end answers -->

之间的所有代码

请务必勾选Regular Expressiondot match newline

答案 2 :(得分:0)

您可以编写一个小应用程序来将文件读取为长字符串。 然后使用类似......

之类的东西确定第一条评论的索引
xml.IndexOfAny("<!-- begin answers -->".ToCharArray(), 0, xml.Count());
xml.IndexOfAny("<!-- end answers -->".ToCharArray(), 0, xml.Count());

知道了索引后,可以使用SubString查找索引之间的内容。你将不得不玩开始和结束的索引来找到它们之间的确切内容。上面的代码在C#中,但Java中有相同的API。

答案 3 :(得分:0)

YWE关于你的正则表达式无法正常运作的原因是完全正确的; +1给他。

请参阅下面的代码,了解在Python中执行此类操作是多么容易。请注意,这可以在一个文件上运行,但您可以轻松修改以搜索和替换文件目录。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

def main():
    FIN = 'fin.html'
    FOU = 'fou.html'
    with open(FIN, 'r') as fin, open(FOU, 'w') as fou:
        re_sub = re.compile('<!-- begin answers -->(.*)<!-- end answers -->', 
                            re.DOTALL) # DOTALL enables multiline patterns
        text_to_search_replace = infile.read()
        outfile.write(re_sub.sub('...[some new code]', text_to_search_replace))

if __name__ == "__main__":
    main()

DOTALL文件
A.M. Python regex HOWTO了Kuchling

答案 4 :(得分:0)

在Find&amp;中使用以下内容替换( 正则表达式 .matches newline 已选中)对我有用:

<!-- begin answers -->(.*?)<!-- end answers -->