正则表达式失败“无法识别的转义序列”

时间:2013-05-23 20:03:26

标签: c# regex

module107应与示例文本Module ID="107"

匹配

你能帮我理解我在代码中出错的地方吗?

var module107 = Regex("\A*Module\sID=\"107\"");

错误:无法识别的转义序列

3 个答案:

答案 0 :(得分:4)

这里的问题是,你想要逃脱两个不同的级别。 \A是正则表达式的转义序列。但问题是,首先是字符串试图解释转义序列,字符串不知道转义序列\A\s(我不知道)。

可能有两种解决方案:

  1. 如果您正在逃避正则表达式,请将\加倍。所以

    var module107 = Regex("\\A*Module\\sID=\"107\"");
    

    是字符串,处理完字符串后,正则表达式为\A*Module\sID="107"

  2. 使用逐字字符串。如果在字符串之前添加@,则字符串不会计算转义序列。因此,Regex(@"\A*Module\sID=")将以正则表达式\A*Module\sID=

    结束

    但是现在你在正则表达式中想要拥有"时遇到问题。您可以通过加倍将"添加到逐字字符串中:

    var module107 = Regex(@"\A*Module\sID=""107""");
    

答案 1 :(得分:1)

描述

这将匹配模块id =“107”,其中数字是由双引号括起的任何数字位数。我已使用[""]更改了转义引号,因此它们可以嵌套到字符串中。我正在使用\b来查找单词break并允许字符串出现在输入中的任何位置。但是,如果您要验证特定文本,则可以执行\A^来表示字符串的开头。

\b(Module\s+ID=[""](\d{1,})[""])

enter image description here

组0将捕获整个字符串

  1. 将获得从模块到第二个引用的内容
  2. 将获取引号内的值
  3. C#代码示例:

    using System;
    using System.Text.RegularExpressions;
    namespace myapp
    {
      class Class1
        {
          static void Main(string[] args)
            {
              String sourcestring = "for Module ID=""107"" Can you h";
              Regex re = new Regex(@"\b(Module\s+ID=[""](\d{1,})[""])",RegexOptions.IgnoreCase);
              MatchCollection mc = re.Matches(sourcestring);
              int mIdx=0;
              foreach (Match m in mc)
               {
                for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
                  {
                    Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
                  }
                mIdx++;
              }
            }
        }
    }
    
    $matches Array:
    (
        [0] => Array
            (
                [0] => Module ID="107"
            )
    
        [1] => Array
            (
                [0] => Module ID="107"
            )
    
        [2] => Array
            (
                [0] => 107
            )
    
    )
    

答案 2 :(得分:1)

关键是你键入的文本首先被解释为字符串,然后被解释为正则表达式。字符串解释也会查看'\'并在解释中使用它们。

正如Tyanna所说,这意味着你需要逃避这些'',以便在读取字符串或混淆字符串解析器时不会“用完”。

您可能想尝试的另一种方法是使用字符串文字。使用正则表达式时,这可能会更清晰一些,因为你不会得到大量的斜杠(有时候只是更多的双引号):

var module107 = new Regex(@"\A*Module\sID=""107""");