2009-03-16 17 views
0

アイテム番号とアイテムの説明に分割したい"アイテム番号 - アイテムの説明 "、" 13-40 - コンピュータキーボード "などのテキストがあります。正規表現とグループ "

これは1つの正規表現で可能ですか、2つ必要ですか(項目と説明のどちらか)

私はそれを「グループ化」する方法を考えることができません。アイテム番号はこれと同じであり、説明はこれが可能です。すべてがアイテム番号であるとは考えません。例:

(\w(\w|-|/)*\w)-.* 

はすべて1と一致します。

これは私が使用しているコードです:ここでは

Regex rx = new Regex(RegExString, RegexOptions.Compiled | RegexOptions.IgnoreCase); 
MatchCollection matches = rx.Matches("13-40 - Computer Keyboard"); 
Assert.AreEqual("13-40", matches[0].Value); 
Assert.AreEqual("Computer Keyboard", matches[1].Value); 
+0

:私は、彼は彼が望んでいる結果を生成する正規表現を見つけたいと考えています。彼は正規表現(ここではRegExString)のみを変更できますが、残りのコードは変更できません。 (私の答えは、テストされた解決策を提供します。) – strager

+0

Ehh、nevermind。どうやら、私は間違っていた(サムエルの答えが受け入れられたように)。 – strager

答えて

4

投稿したコードから、あなたは正しく正規表現を使用しています。製品全体を一致させ、マッチ内のキャプチャを使用して番号と説明を抽出する1つの正規表現パターンが必要です。

string RegExString = @"(?<number>[\d-]+)\s-\s(?<description>.*)"; 
Regex rx = new Regex(RegExString, RegexOptions.Compiled | RegexOptions.IgnoreCase); 
Match match = rx.Match("13-40 - Computer Keyboard"); 
Debug.Assert("13-40" == match.Groups["number"].Value); 
Debug.Assert("Computer Keyboard" == match.Groups["description"].Value); 
1

Rubyで働く正規表現である - C#の正規表現の違いがあるかどうかわからない:

/^([\d\-]+) \- (.+)$/ 
+0

これは、 "13-40 - Computer Keyboard"全体をC#の1文字列と一致させます。 –

1
([0-9-]+)\s-\s(.*) 

をグループ1には項目番号が含まれ、グループ2には説明が含まれます。

+0

これは、 "13-40 - Computer Keyboard"全体をC#の1文字列と一致させます。 –

+0

@dan gibson、これは本当です。これを行うことになっています。結果のパーツは2つのグループに分かれています。 – strager

0

テキストが常にダッシュで区切られていて、でデータ内のダッシュを処理しなければ、正規表現を使用する必要はありません。

string[] itemProperties = item.Split(new string[] { "-" }); 
itemProperties = itemProperties.Select(p => p.Trim()); 
Item item = new Item() 
{ 
    Number = itemProperties[0], 
    Name = itemProperties[1], 
    Description = itemProperties[2] 
} 
+0

ユーザーは任意の形式に一致する正規表現を提供できるので、正規表現を使用する必要があります。 –

1

CaffeineFueledの答えは正しいです。

Match match = Regex.Match("13-40 - Computer Keyboard", @"^([\d\-]+) \- (.+)$"); 
Console.WriteLine(match.Groups[1]); 
Console.WriteLine(match.Groups[2]); 

結果:

13-40
コンピュータのキーボード

+0

2つの投稿された正規表現のパターンはどちらも動作しますが、質問者はそれを正しい方法で使用していませんでした(私の答えを見てください)。 – Samuel

0

あなたは、グループに一致するようにしたいように見えるが、複数の一致を持っていません。

多分、これはあなたが望むことをするでしょうか?

(:^.+(?=(-))|(?<=(-)).+$) 

アップスプリット:

(:   Used to provide two possible matches 
^.+   Match item ID text 
(?=(-)) Text must be before " - " 
|   OR 
(?<=(-)) Test must be after " - " 
.+$   Match description text 
) 
0

これは、ようCaffineFueledの答えとしてエレガント多分正規表現初心者のための読みやすいではありません。

String RegExString = "(\d*-\d*)\s*-\s*(.*)"; 
Regex rx = new Regex(RegExString, RegexOptions.Compiled | RegexOptions.IgnoreCase); 
MatchCollection matches = rx.Matches("13-40 - Computer Keyboard"); 
Assert.AreEqual("13-40", matches[0].Value); 
Assert.AreEqual("Computer Keyboard", matches[1].Value); 

またはそれ以上読み:ポスターに

String RegExString = "(\d*-\d*) - (.*)";