2015-07-26 5 views
1

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

test"abc"

test"rst"

код работает отлично.

private void testRegex() 
{ 
    string st = "this test\"abc\"= or test\"rst\"\"uvw\" or test(def)(abc) is a test."; 
    Regex oRegex = new Regex("test\".*?\""); 

    foreach (Match mt in oRegex.Matches(st)) 
    { 
     Console.WriteLine(mt.Value); 
    } 
} 

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

"abc"

"rst"

private void testRegex() 
    { 
     string st = "this test\"abc\"= or test\"rst\"\"uvw\" or test(def)(abc) is a test."; 
     Regex oRegex = new Regex("test(\".*?\")"); 

     foreach (Match mt in oRegex.Matches(st)) 
     { 
      Console.WriteLine(mt.Groups[1].Value); 
     } 
    } 

Вопрос: Теперь я хочу захватить два подвыражения 1. «abc» и «rst» 2. Любой символ, кроме «который следует за совпадением« abc »и« rst ». Итак, я попробовал следующее, но, как показано ниже, группы 1 и 2 для матча «rst» «uvw» неверны. Мне нужна 1-я группа «первого» «UVW» быть «первым» и 2-й группы, чтобы быть пустым, так как символ, который следует «сначала» является «:

Группа 1:„а“

Группы 2: =

Группа 1: "первый"»

Группа 2: и

private void testRegex() 
     { 
      string st = "this test\"abc\"= or test\"rst\"\"uvw\" or test(def)(abc) is a test."; 
      Regex oRegex = new Regex("test(\".*?\")([^\"])"); 

      foreach (Match mt in oRegex.Matches(st)) 
      { 
       Console.WriteLine(mt.Groups[1].Value); 
       Console.WriteLine(mt.Groups[2].Value); 
      } 
     } 

ответ

1

Вы должны искать

test("[^"]*")([^"])? 

См demo

Я сделал 2 изменения:

  • Используется класс инвертированный характер [^"]* (соответствие 0 или более других, чем двойные кавычки символов) вместо ленивого согласования любых символов с .*?
  • Made [^"] опционально с квантором ?.

enter image description here

+1

сделали бы это точно так же, за исключением того, что last '?' кажется более интуитивным, если вы поместите его внутри группы. – maraca

+0

Ввод? внутри группы будет изменен номер группы следующей группы (если таковой существует). Мне нравится ? вне группы – jdweng

+0

@stribizhev, спасибо. Это сработало. В моем коде на C# мне пришлось сбежать из «сделать это:' test (\ "[^ \"] * \ ") ([^ \"])?' – nam

0

Два альтернативная версия:

(?<=test)("[^"]+")([^"])? 

В случае, если вы хотите сохранить результат в одном месте:

(?<=test)("[^"]+"[^"]?)