我可以在Regex中使用模式中的变量(C#)

时间:2010-11-04 17:21:38

标签: c# regex

我有一些HTML文本,我需要将文字替换为链接。例如,我有单词“PHP”的文本,并希望用< a href =“glossary.html#php”> PHP< / a>替换它。我需要替换许多单词。

我的代码:

public struct GlossaryReplace
{
    public string word; // here the words, e.g. PHP
    public string link; // here the links to replace, e.g. glossary.html#php
}
public static GlossaryReplace[] Replaces = null;    

IHTMLDocument2 html_doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
string html_content = html_doc.body.outerHTML;

for (int i = 0; i < Replaces.Length; i++)
{
    String substitution = "<a class=\"glossary\" href=\"" + Replaces[i].link + "\">" + Replaces[i].word + "</a>";
    html_content = Regex.Replace(html_content, @"\b" + Replaces[i].word + "\b", substitution);
}
html_doc.body.innerHTML = html_content;

问题是 - 这不起作用:(但是,

html_content = Regex.Replace(html_content, @"\bPHP\b", "some replacement");

这段代码效果很好!我无法理解我的错误!

2 个答案:

答案 0 :(得分:3)

你忘记了@

@"\b" + Replaces[i].word + "\b"

应该是:

@"\b" + Replaces[i].word + @"\b"

如果您要修改HTML,我还建议您使用HTML解析器。 HTML Agility Pack是用于此目的的有用库。

答案 1 :(得分:3)

字符串的@前缀仅适用于紧随其后的字符串,因此当您连接字符串时,可能必须在每个字符串上使用它。

改变这个:

html_content = Regex.Replace(html_content, @"\b" + Replaces[i].word + "\b", substitution);

为:

html_content = Regex.Replace(html_content, @"\b" + Replaces[i].word + @"\b", substitution);

在正则表达式中\b表示单词边界,但在字符串中表示退格符(ASCII 8)。如果使用字符串中不存在的转义码(例如\s),则会出现编译器错误,但在这种情况下不会,因为代码同时存在于字符串和正则表达式中。

旁注;在动态创建正则表达式模式时非常有用的方法是Regex.Escape方法。它会转义要在模式中使用的字符串中的字符,因此即使单词包含在正则表达式中具有特殊含义的字符,@"\b" + Regex.Escape(Replaces[i].word) + @"\b"也会使该模式起作用。