次のような文字列があります。
attr one = 1 attr two = 2
それぞれを抽出したいと思いますattr x = y
(ここで、xとyは、数字だけでなく、空白を含む任意のものにすることができます:attr name = Jonah)。
私は次のパターンを試しました:Regex pattern = new Regex(@"attr\s+(?<name>.*)\s+=\s+(?<value>.*)")
しかし、それは単一の一致で文字列全体を返し、それらを分離しません。
どうすればそれを達成できますか?
あなたは使用することができます
\battr\s+(?<name>\S*)\s+=\s+(?<value>.*?)(?=\s+attr\s|\z)
正規表現のデモを見る
詳細
\battr
-一言 attr
\s+
-1つ以上の空白(?<name>\S*)
-グループ「名前」:0個以上の非空白文字\s+=\s+
- =
1+空白で囲まれた文字(?<value>.*?)
-グループ「値」:改行以外の0個以上の文字をできるだけ少なくします。(?=\s+attr\s|\z)
-その直後に1attr
つ以上の空白と空白、または文字列の終わりが続きます。C#デモを参照してください(names
すべてが一意であると想定しています)。
var text = "attr one = one two three attr two = 3";
var dct = Regex.Matches(text, @"\battr\s+(?<name>\S*)\s+=\s+(?<value>.*?)(?=\s+attr\s|\z)")
.Cast<Match>()
.ToDictionary(p => p.Groups["name"].Value, p => p.Groups["value"].Value);
foreach (var kvp in dct)
Console.WriteLine("{0} -> {1}", kvp.Key, kvp.Value);
出力:
one -> one two three
two -> 3
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加