C# 正则表达式-在某些情况下正向前瞻不起作用
我正在循环遍历一组C#关键字,并为每个关键字应用正则表达式。(我正在进行语法高亮显示。) 我只想在以下情况下匹配:C# 正则表达式-在某些情况下正向前瞻不起作用,c#,regex,C#,Regex,我正在循环遍历一组C#关键字,并为每个关键字应用正则表达式。(我正在进行语法高亮显示。) 我只想在以下情况下匹配: 关键字是行中的第一个单词或前面的字符 空格、句号或开括号 及 关键字后面的字符是空格、句点或open 括号 以下是我的想法: foreach (string keyword in keyWords) { regex = new Regex(@"(?<=[\s\.(])" + keyword + @"(?=[\s\.(])");
- 关键字是行中的第一个单词或前面的字符 空格、句号或开括号 及
- 关键字后面的字符是空格、句点或open 括号
foreach (string keyword in keyWords)
{
regex = new Regex(@"(?<=[\s\.(])" + keyword + @"(?=[\s\.(])");
foreach (Match match in regex.Matches(code))
{
code = code.Replace(match.Value, "<span class='keyword'>" + match.Value + "</span>");
}
}
foreach(关键字中的字符串关键字)
{
regex=newregex(@)(?下面是我在评论中引用的内容的一个非常简单的演示:
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);
StringBuilder sb=新建StringBuilder();
sb.附录(“使用系统;”;
(某人);
sb.AppendLine(“名称空间Foo.Bar”);
某人附加物(“{”);
sb.附录(“\t公共类Baz”);
sb.附录(“\t{”);
sb.AppendLine(“\t\tpublic static void Main()”);
sb.AppendLine(“\t\t{”);
sb.AppendLine(“\t\t\t字符串[]a=new[]{\'foo\',\'bar\',\'baz\'};”);
sb.AppendLine(“\t\t\t用于每个(a)控制台中的变量b.WriteLine(b);”;
sb.AppendLine(“\t\t}”);
sb.附录(“\t}”);
(b)附加物(“}”);
Console.Write(sb.ToString());
Console.WriteLine();
字符串[]关键字=新字符串[]{
“使用”“命名空间”“for”“if”“else”“foreach”
};
字符串代码=sb.ToString();
foreach(关键字中的字符串关键字){
String pattern=@”(?我认为您需要转义括号。当您想按字面意思使用它们时,必须表示\(
或\)
您正在使用正则表达式在行内进行匹配,然后恢复为字符串替换?为什么不使用正则表达式。替换?@AndreCalil这在[]内适用吗太好了?不管怎样,这都没什么区别。@Rivka:使用引用$1
,$2
,等等@AndreCalil:他想说的是“字符类”——即[\s.(]
——不,你不需要转义paren或dot。使用静态regex方法很好,因为至少它们会进行一些正则缓存,而不是不进行缓存。另外,一个(针对例外情况进行了轻微修改)上的IDEOne@RivkaBrad,更改你的第二个要点,以使用正在更改的“字符串”中的“in”,即使它不是匹配的“in”,因为这就是她的代码被破坏的原因。非常感谢大家-非常感谢你的帮助。因此,看起来我缺少的部分是第三个要点-“^ |”@BradChristie谢谢你的例子和其他建议。
<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);
}
}
}