2011-02-09 10 views
1

正規表現が大好き!しかし、「ヘッダ」は、多くの場合、異なるだろう、すべて1行になります正規表現問題、グループにデータを抽出

<Category>DIR</Category><Location>DL123A</Location><Reason>Because</Reason><Qty>42</Qty><Description>Some Desc</Description><IPAddress>127.0.0.1</IPAddress> 

すべて:

は、私は次のように、XMLのマングルされた形になります文字列を持っています。

だから私は何をする必要があるか辞書/ Hashtableの

にそれを入れて、上記の文字列からすべての情報を抽出している -

string myString = @"<Category>DIR</Category><Location>DL123A</Location><Reason>Because</Reason><Qty>42</Qty><Description>Some Desc</Description><IPAddress>127.0.0.1</IPAddress>"; 

//this will extract the name of the label in the header 
Regex r = new Regex(@"(?<header><[A-Za-z]+>?)"); 

//Create a collection of matches 
MatchCollection mc = r.Matches(myString); 

foreach (Match m in mc) 
{ 
    headers.Add(m.Groups["header"].Value); 
} 


//this will try and get the values. 
r = new Regex(@"(?'val'>[A-Za-z0-9\s]*</?)"); 

mc = r.Matches(myString); 

foreach (Match m in mc) 
{ 
    string match = m.Groups["val"].Value; 
    if (string.IsNullOrEmpty(match) || match == "><" || match == "> <") 
     continue; 
    else 
     values.Add(match); 
} 

- 私はと前作から一緒にそれをハッキング私ができる最も近いところへの正規表現。 しかし、それは本当に私がそれを望むように動作しません。

「ヘッダ」はまた、角度ブラケットを引っ張る。

「値は」空に多くの(ループ内したがってもし危険なステートメント)に引っ張ります。また、ピリオド、カンマ、スペースなどの文字列では機能しません。

2つのステートメントを組み合わせることができたら、正規表現を2回繰り返す必要はありません。

誰でも私にそれを改善できる情報を教えてもらえますか?

Regex r = new Regex(@"<(?<header>[A-Za-z]+)>"); 

を、これは空のスペースを取り除く必要があります:

答えて

3

、.NETのXMLパーサの機能を使用しない理由?あなたがやらなければならないことは、その周りにルート要素を追加することです:

string myString = @"<Category>DIR</Category><Location>DL123A</Location><Reason>Because</Reason><Qty>42</Qty><Description>Some Desc</Description><IPAddress>127.0.0.1</IPAddress>"; 

var values = new Dictionary<string, string>(); 
var xml = XDocument.Parse("<root>" + myString + "</root>"); 
foreach(var e in xml.Root.Elements()) { 
    values.Add(e.Name.ToString(), e.Value); 
} 
+0

私にそれを打つ。可能であれば、ほとんどの場合、正規表現に比べてXMLパーサーを好むべきです。それが彼らのためのものです。 –

+0

ありがとう。私はXMLパーサを使うことは考えていませんでした。なぜならそれはひどく最初から構成されていたからです。それは私に多くの正規表現の頭痛を救った。 –

1

これは角括弧を取り除く必要があり、それはXMLのように見える場合

r = new Regex(@">\s*(?'val'[A-Za-z0-9\s]*)\s*</"); 
1

これはせずに、ヘッダーと一致します<>:

(?<=<)(?<header>[A-Za-z]+)(?=>) 

これは私がわからないんだけど(すべての値を得るもの)の値として受け入れることができます。

(?<=>)(?'val'[^<]*)(?=</) 

しかし、これはすべてのXMLあなたができるようです:

XDocument doc = XDocument.Parse(string.Format("<root>{0}</root>",myString)); 
var pairs = doc.Root.Descendants().Select(node => new KeyValuePair<string, string>(node.Name.LocalName, node.Value));