0

module107 should be matching the sample text Module ID="107"

Can you help me understand where I am going wrong in the code?

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

ERROR: Unrecognized escape sequence

4

3 回答 3

4

The problem here is, you want to escape for two different levels. The \A is a escape sequence for the regex. But the issue is, there is at first the string that tries to interpret escape sequences and the string does not know the escape sequence \A or \s (I don't know).

Two solutions are possible:

  1. if you are escaping for the regex, double the \. So

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

    is the string and after the string is processed, the regex is \A*Module\sID="107"

  2. Use verbatim strings. If you add a @ before the string, escape sequences are not evaluated by the string. So Regex(@"\A*Module\sID=") would end as regex \A*Module\sID=

    But now you are getting problems with the " you want to have in the regex. You can add a " to a verbatim string by doubling it:

    var module107 = Regex(@"\A*Module\sID=""107""");
    
于 2013-05-23T21:07:56.853 回答
1

Description

This will match the module id="107" where the number is any quantity of digits surrounded by double quotes. I've changed your escaped quotes with [""] so they can be nested into a string. I'm using \b which will look for the word break and will allow the string to appear anywhere in the input. But if you're looking to validate a specific text, then you can do the \A or ^ to denote the beginning of the string instead.

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

enter image description here

Groups

Group 0 will capture the entire string

  1. will get the have from Module to the second quote
  2. will get the value inside the quotes

C# Code Example:

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
        )

)
于 2013-05-23T21:00:30.150 回答
1

The key thing is that the text you've typed is interpreted as a string first, then as a Regex. The string interpretation also looks at '\'s and uses them in its interpretation.

As Tyanna says, this means you need to escape those '\'s so that they don't get 'used up' as the string is read or confuse the string parser.

An alternative approach you might like to try is to use a string literal. This can be a bit cleaner when working with Regexes, as you don't end up with lots of slashes (just more double-quotes sometimes):

var module107 = new Regex(@"\A*Module\sID=""107""");
于 2013-05-23T21:09:00.590 回答