2013-06-14 2 views
2

Скажите, что я имел строкиRegularExpressions Extract Все десятичные значения и перебирать

<Records> 
     <record id='818591'/> 
     <record id='818592'/> 
     <record id='818593'/> 
     <record id='818594'/> 
     <record id='818595'/> 
     <record id='818596'/> 
     <record id='818597'/> 
     <record id='818598'/> 
</Records> 

Как в C#, я мог извлечь, и перебирать все «ID» значение.

Я предполагаю, что это будет что-то вроде этого:

foreach (Match match in Regex.Matches(archerResponse,@"<Records>(<record id='\d*'/>)*</Records>")) 
{ 
     //get value 
} 

Но как же я просто вытащить десятичную?

+1

Использовать XML-парсер? –

+0

Давайте сделаем вид, что это недопустимо xml –

+0

Если ваш xml недействителен, синтаксический анализатор будет выбрасывать, что желательно, потому что вы хотите знать, плохо ли ваш источник данных (вывоз мусора/мусор). Но если вы ожидаете, что это будет недопустимым, регулярное выражение будет хорошей альтернативой. – Jay

ответ

1

Я бы использовать парсер:

XElement.Parse(archerResponse) 
    .Elements("record") 
    .SelectMany(n => n.Attributes("id")) 
    .Select(x => x.Value); //gives you a collection of the items needed. 

Если вы действительно хотите регулярное выражение, использовать захват группы:

foreach (Match match in Regex.Matches(archerResponse,@"<Records>(<record id='(\d+)'/>)*</Records>")) 
{ 
    string result = match.Groups[0]; 
} 

(обратите внимание на скобки \d+!)

1
// main program 
using System; 
using System.Linq; 
using System.Xml.Linq; 
using System.Collections; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     public static void Main() 
     { 
      XDocument doc = XDocument.Parse(@"<Records> <record id='818591'/> <record id='818592'/> <record id='818593'/> <record id='818594'/> <record id='818595'/> <record id='818596'/> <record id='818597'/> <record id='818598'/></Records>"); 

      foreach (string s in doc.Descendants().Attributes("id").Select(a => a.Value)) 
      { 
       Console.WriteLine(s); 
      } 
     } 
    } 
} 

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

"id='(.*?)'" 

http://rubular.com/r/Pd4NbqDeVw

+0

Это не полный XML-файл ... –

+0

@newStackExchangeInstance, чем вы можете использовать 'XDocument.Parse (string)' вместо 'XDocument.Load()' –

+0

Нет, вы бы использовали XElement.Parse;) –

1

Пробуйте это для размера:

string text = 
     @"<Records><record id='818591'/><record id='818592'/><record id='818593'/><record id='818594'/><record id='818595'/><record id='818596'/><record id='818597'/><record id='818598'/></Records>"; 

    MatchCollection matches = Regex.Matches(text, @"[0-9]+(\.[0-9][0-9]?)?"); 

    if(matches.Count > 0) 
    { 
     foreach (var value in matches) 
     { 
      Console.Write(value); 
     } 
    } 
+0

, этот шаблон регулярного выражения допускает дополнительную десятичную точность, т.е. соответствует 1 и 1.01 – invertigo

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