Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式-在某些情况下正向前瞻不起作用_C#_Regex - Fatal编程技术网

C# 正则表达式-在某些情况下正向前瞻不起作用

C# 正则表达式-在某些情况下正向前瞻不起作用,c#,regex,C#,Regex,我正在循环遍历一组C#关键字,并为每个关键字应用正则表达式。(我正在进行语法高亮显示。) 我只想在以下情况下匹配: 关键字是行中的第一个单词或前面的字符 空格、句号或开括号 及 关键字后面的字符是空格、句点或open 括号 以下是我的想法: foreach (string keyword in keyWords) { regex = new Regex(@"(?<=[\s\.(])" + keyword + @"(?=[\s\.(])");

我正在循环遍历一组C#关键字,并为每个关键字应用正则表达式。(我正在进行语法高亮显示。)

我只想在以下情况下匹配:

  • 关键字是行中的第一个单词或前面的字符 空格、句号或开括号

  • 关键字后面的字符是空格、句点或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);
    }
  }
}