2015-08-03 6 views
2

Я пытаюсь извлечь строку между двумя кавычками, и я думал, что у меня есть регулярное выражение, но оно дает мне две строки в моем GroupCollection, и я не могу заставить его игнорировать первый один, который включает в себя первую цитату и ID =Regex для извлечения строки между кавычками

строка, которую я хочу разобрать это

Test ID = «12345» привет

Я хочу вернуть 12345 в группе , так что я могу манипулировать им в коде позже. Я попробовал следующее регулярное выражение: http://regexr.com/3bgtl, с этим кодом:

nodeValue = "Test ID=\"12345\" hello"; 
GroupCollection ids = Regex.Match(nodeValue, "ID=\"([^\"]*)").Groups; 

Проблема состоит в том, что GroupCollection содержит две записи:

ID = "12345

Я просто хочу, чтобы он вернул второй.

+1

Вам необходимо распечатать группу 1. –

ответ

2

Используйте положительный оператор просмотра назад:

GroupCollection ids = Regex.Match(nodeValue, "(?<=ID=\")[^\"]*").Groups; 

Вы также использовали захватывая группу (скобка), поэтому вы получите 2 результаты.

+0

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

1

Есть несколько способов сделать это. Мне нравятся названные группы захвата для удобства чтения.

Regex с именем группы захвата:

"(?<capture>.*?)" 

И ваш код будет:

match.Groups["capture"].Value 
1

Ваш код абсолютно нормально и является наиболее эффективным из всех решений предлагаемых здесь. Группы захвата позволяют наиболее быстрый и наименее ресурсоемкий способ сопоставления подстрок внутри больших текстов.

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

var nodeValue = "Test ID=\"12345\" hello"; 
GroupCollection ids = Regex.Match(nodeValue, "ID=\"([^\"]*)").Groups; 
Console.WriteLine(ids[1].Value); 
// or just on one line 
// Console.WriteLine(Regex.Match(nodeValue, "ID=\"([^\"]*)").Groups[1].Value); 

См IDEONE demo

Пожалуйста, посмотрите на Grouping Constructs in Regular Expressions:

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

  • Сопоставьте подвыражение, которое повторяется во входной строке.
  • Применение квантора к подвыражению, которое содержит несколько элементов языка регулярных выражений. Дополнительные сведения о квантификаторах см. В разделе [Квантеры в регулярных выражениях] [3].
  • Включите подвыражение в строке, возвращаемой методами [Regex.Replace] [4] и [Match.Result] [5].
  • Извлеките отдельные подвыражения из свойства [Match.Groups] [6] и обработайте их отдельно от согласованного текста в целом.

Обратите внимание, что , если вам не нужно перекрывающихся матчи, захватывая механизм группы является лучшим решением здесь.

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