2013-09-30 3 views
0

Я хотел бы извлечь «Child 1» и «Родитель 1» (без кавычек) из строкишаблон строки с четырьмя апострофов

there is a child object with name "Child 1" under parent "Parent 1" in the tree 

шум струнного

there is a child object with name "([\w\s^"]+)" under parent "([\w\s^"]+)" in the tree 

не кажется, быть верным, поскольку он соответствует также всей строке, которую я не хочу.

Я тестировал его с помощью http://www.myregextester.com/index.php.

Мне нужно это, чтобы написать шаг для SpecFlow в C#.

Спасибо.

+0

На самом деле, кажется, что проблема вызвана наличием другой строки шаблона регулярного выражения для одного из мое другое определение шага SpecFlow: 'есть дочерний объект с именем" ([\ w \ s^"] +)" в дереве ", который применяется для:' есть дочерний объект с именем "Child 1" в tree. Если я прокомментирую это определение шага, исходная строка понимается SpecFlow, но если оба шага присутствуют, этот признан, другой с четырьмя апострофами не является. –

+0

Согласие на то, что параметры SpecFlow в апострофах облегчают читателю и разработчику тестов возможность видеть, что используется. Удаление апострофов усложнит возможность увидеть, что такое параметры SpecFlow. –

ответ

0

Ваше регулярное выражение шаблон: ([\w\s^"]+) будет соответствовать строки в кавычках в

Я не уверен, почему этот эффект происходит.. Кажется, что смешанные инклюзивные наборы символов и эксклюзивные не работают. Мне было бы интересно, есть ли у кого-то больше знаний по этому вопросу.

Действительно, вы хотите ([^"]+), I.E.

there is a child object with name "([^"]+)" under parent "([^"]+)" in the tree 

для одного из ваших шагов и

there is a child object with name "([^"]+)" in the tree 

для другого.

0

Мне кажется, что он чище не использовать Regex для этого. Если вы немного отклоните свое требование и попробуйте только регулярное выражение, оно будет соответствовать тексту между закрывающей цитатой и открывающей.

Возможно, вы получите лучшие результаты, сделав это вручную?

string[] extractBetweenQuotes(string str) 
    { 
     var list = new List<string>(); 
     int firstQuote = 0; 
     firstQuote = str.IndexOf("\""); 

     while (firstQuote > -1) 
     { 
      int secondQuote = str.IndexOf("\"", firstQuote + 1); 
      if (secondQuote > -1) 
      { 
       list.Add(str.Substring(firstQuote + 1, secondQuote - (firstQuote + 1))); 
       firstQuote = str.IndexOf("\"", secondQuote + 1); 
       continue; 
      } 

      firstQuote = str.IndexOf("\"", firstQuote + 1); 
     } 

     return list.ToArray(); 
    } 

Использование:

string str = "there is a child object with name \"Child 1\" under parent \"Parent 1\" in the tree"; 

string[] parts = extractBetweenQuotes(str); // Child 1 and Parent 1 (no quotes) 
+0

Большое спасибо, Саймон, за ваш вклад. Однако я не знаю, позволяет ли SpecFlow реализовать пользовательские парсеры. –

0

Так что ваш текущий узор делает;

(#Start group 
    [ #start choice of 
    \w # word character 
    \s #whitespace 
    ^" #not a speechmark 
    ] # end choice 
    + # at least one of the choices 
) # end group 

И потому Regex жаден по умолчанию, он может держать соответствующие символы слова или пробелы в конце строки.

Я бы вместо этого предлагает вам просто использовать

[^"]+ #keep going until you hit a speechmark 

И в specflow это выглядит как

[Given("there is a child object with name \"[^\"]+\" under parent \"[^\"]+\" in the tree")]   
+0

Это также мой принятый ответ. –

Смежные вопросы