我正在尝试在两个评论标签之间选择一个代码块,如下所示:
<!-- begin answers -->
...[code]
<!-- end answers -->
我尝试了类似<!-- begin answers -->.*<!-- end answers -->
的内容,但我的正则表达式知识相当有限。我对Notepad ++的查找和替换的了解非常有限,但我使用它的原因是因为“替换打开文件”选项被认为是非常有用的。这是因为我正在对大约4000个文件进行搜索/替换。
这些注释之间的代码可能会有所不同(空格,空格),所以我需要一些灵活的东西来处理它。
谢谢!
答案 0 :(得分:3)
你试过的正则表达式应该可以工作但不幸的是,Notepad ++使用的正则表达式引擎(Scintilla)无法在新行中匹配。所以没有办法做到这一点。 此限制记录在案here。它也只支持非常基本的表达式。而且你不能只选择注释之间的文本(也不能选择注释),因为不支持前瞻和后面的断言。
答案 1 :(得分:1)
你可以使用自Notepad ++ v~6.0 +:
搜索:(?<=<!-- begin answers -->\r?\n).*?(?=<!-- end answers -->)
这将突出显示<!-- begin answers -->\r?\n
和<!-- end answers -->
请务必勾选Regular Expression
和dot 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 -->