【发布时间】:2009-11-06 11:23:57
【问题描述】:
我有一组要通过替换页眉和页脚来修改的 html 文件。每个文件的内容都不同,我想使用正则表达式(如果 RE 无法处理多行查询,则使用类似的表达式)。
作为一个例子,我想做的一个修改是用标准标题替换 和 之间的所有内容。
这可以用正则表达式来完成吗?你会使用什么方法在 C# 中执行这样的批量搜索和替换?
你能提供一个匹配多行的正则表达式的例子吗?
【问题讨论】:
我有一组要通过替换页眉和页脚来修改的 html 文件。每个文件的内容都不同,我想使用正则表达式(如果 RE 无法处理多行查询,则使用类似的表达式)。
作为一个例子,我想做的一个修改是用标准标题替换 和 之间的所有内容。
这可以用正则表达式来完成吗?你会使用什么方法在 C# 中执行这样的批量搜索和替换?
你能提供一个匹配多行的正则表达式的例子吗?
【问题讨论】:
嗯,简单的答案是,是的。
Regex 确实可以帮助您,但您需要一个可以处理多个文件的工具。我目前无法推荐任何内容,请尝试谷歌搜索“多文件搜索和替换”。正则表达式可以应对多行或单行匹配。
我使用 Notepad++,它可以做一些你想做的事情,在多个文件(打开或在目录树中)进行搜索/替换,这不是主要目标,但它确实有效。
困难的部分是定义您的“匹配”,确保您要在哪里挑选出您需要保留的详细信息,并确保您有一个可以在“替换”表达式中使用的适当捕获组。
所以,再次,是的,它可以提供帮助,但你的问题非常高。
对于 C# 部分,定义正则表达式后就很简单了。
static void Main()
{
// Remove everything (by commenting out) everything between HTML
// and the end of the HEAD tag.
string matchRegex = "<html[^>]*>(.*?)</head>";
string replaceExpression = "<html> <!-- \0 </head> -->";
string pattern = "*.html";
using ( DirectoryInfo di = new DirectoryInfo(.) )
{
foreach (FileInfo fi in di.GetFiles(pattern))
{
using ( StreamReader sr = fi.OpenText() )
{
// Going from memory here, may need to use a TextReader...
string content = fi.ReadToEnd();
// Treat as single-line so that the match can span
// several lines.
string newContent = Regex.Replace(content,
matchRegex,
replaceExpression,
RegexOptions.Singleline);
// Write-out/overwirte your new file here....
}
}
}
}
您可能会发现此页面很有用,其中有人正在尝试编写正则表达式来匹配 cmets,然后处理多行 cmets 等。它显示了正则表达式的思考过程。 Finding Comments in source code。替换部分很简单,放入一个捕获组并在替换字符串中引用组/名称!
【讨论】: