2013-05-23 3 views
0

module107 должен быть соответствующий образец текста Module ID="107"Regex В противном случае «Непризнанные последовательность»

Можете ли вы помочь мне понять, где я неправильно в коде?

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

ОШИБКА: Непризнанный последовательность выхода

+10

Я думаю, что вам нужно, чтобы избежать \ а. Итак, «\\ A * Module \\ sID = \" 107 \ "". – Tyanna

+0

Итак, вам всегда нужно избегать разных, например? \ b \ W \ d \ f и т. д.? Для меня это означает, что они почти всегда считались бы \\ b \\ W \\ d \\ f, затем правым? –

+0

\ - символ побега. Если он находится в вашей строке, но вы не хотите, чтобы он ушел от следующего символа, вам нужно его избежать, поэтому он превращается в \\. т.е. ~ \ "означает просто" в вашей строке выше. – Tyanna

ответ

3

Проблема здесь, вы хотите, чтобы уйти на двух разных уровнях. \A - это escape-последовательность для регулярного выражения. Но проблема в том, что сначала строка, которая пытается интерпретировать escape-последовательности, и строка не знает escape-последовательности \A или \s (я не знаю).

возможны два решения:

  1. если вы спасаясь для регулярного выражения, в два раза \. Так

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

    является строка, и после того, как строка обрабатывается, регулярное выражение является \A*Module\sID="107"

  2. Используйте стенографические строки. Если вы добавите @ перед строкой, escape-последовательности не будут оцениваться строкой. Так Regex(@"\A*Module\sID=") закончится как regex \A*Module\sID=

    Но теперь у вас возникают проблемы с ", которые вы хотите иметь в регулярном выражении. Вы можете добавить " к дословной строки, удваивая его:

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

Описание

Это будет соответствовать модуль ID = «107», где число любое количество цифр в двойные кавычки. Я изменил ваши экранированные кавычки на [""], чтобы они могли быть вложены в строку. Я использую \b, который будет искать слово break и позволит строке появляться в любом месте входа. Но если вы хотите проверить конкретный текст, вы можете сделать \A или ^, чтобы вместо этого обозначить начало строки.

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

enter image description here

Группы

Группа 0 захватит всю строку

  1. будет получить иметь от модуля до второй цитаты
  2. получит значение внутри котировки

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 
     ) 

) 
1

Главное в том, что текст, который вы набрали интерпретируется как строка, а затем в качестве Regex.Интерпретация строк также смотрит на «\» и использует их в своей интерпретации.

Как говорит Тианна, это означает, что вам нужно избегать этих «так», чтобы они не «истощались», когда строка читается или путает синтаксический анализатор строк.

Альтернативный подход, который вы можете попробовать, - использовать строковый литерал. Это может быть немного чище при работе с регулярными выражениями, так как вы не в конечном итоге с большим количеством косой черты (только более двойные кавычки иногда):

var module107 = new Regex(@"\A*Module\sID=""107"""); 
Смежные вопросы