这是我在评论中引用的一个非常简单的演示:
StringBuilder sb = new StringBuilder();
sb.AppendLine("using System;");
sb.AppendLine();
sb.AppendLine("namespace Foo.Bar");
sb.AppendLine("{");
sb.AppendLine("\tpublic class Baz");
sb.AppendLine("\t{");
sb.AppendLine("\t\tpublic static void Main()");
sb.AppendLine("\t\t{");
sb.AppendLine("\t\t\tString[] a = new[]{\"foo\",\"bar\",\"baz\"};");
sb.AppendLine("\t\t\tforeach (var b in a) Console.WriteLine(b);");
sb.AppendLine("\t\t}");
sb.AppendLine("\t}");
sb.AppendLine("}");
Console.Write(sb.ToString());
Console.WriteLine();
String[] keywords = new String[]{
"using", "namespace", "for", "if", "else", "foreach"
};
String code = sb.ToString();
foreach (String keyword in keywords){
String pattern = @"(?<=^|[\s\.\(])(" + Regex.Escape(keyword) + @")(?=[\s\.\)])";
String replacement = "<span class='keyword'>$1</span>";
code = Regex.Replace(code, pattern, replacement);
}
Console.WriteLine(code);
导致:
<span class='keyword'>using</span> System;
<span class='keyword'>namespace</span> Foo.Bar
{
public class Baz
{
public static void Main()
{
String[] a = new[]{"foo","bar","baz"};
<span class='keyword'>foreach</span> (var b in a) Console.WriteLine(b);
}
}
}
这就是我认为你所追求的。我使用了静态正则表达式方法,但您可以根据需要重构它。我想指出一些事情:
- 我强烈建议
Regex.Escape
您在不是自己构建的正则表达式语句中间插入值时使用。即使关键字只是字母,以后的一些更改也可能会破坏它。安全总比后悔好。
- 如果您打算使用 Regex 来查找关键字,也可以使用它来替换它。这可确保如果找到“for”(并且是关键字),则替换该for 实例(带有look(ahead|behind) 验证,而不是在字符串中找到杂散的“for”(也许它们有一个名为
foreshadow
- 谁知道。
- 我稍微修改了您的后视功能,以包括
^|
匹配行首或在类中找到的内容。
- 我还稍微修改了您的模式以包含一个捕获组,以便替换有一些东西可以定位。