用于字符串拆分的正则表达式两次

时间:2015-05-26 18:44:22

标签: c# .net regex

我有一个在数组中拆分两次的字符串。这是一个例子:

Obj1:Val1|Obj2:Val2|Obj3:Val3

请帮我使用正则表达式来获取第一个字符串的数组:

Obj1
Obj2
Obj3

然后另一个正则表达式获取

Val1
Val2
Val3

我不想迭代。我想一次性使用正则表达式的结果。

5 个答案:

答案 0 :(得分:1)

由于您使用的是C#,您可以先使用|拆分字符串,然后将:作为分隔符的字符串列表,以便您可以使用:拆分子列表并使用zip function获取对象和值列表。

但是作为一种直接的方式,你可以使用以下正则表达式:

for values(第一组):

:(.*?)(\||$)

for objects(第二组):

(\||^)(.*?):

答案 1 :(得分:1)

您可以使用以下内容进行拆分:

[:|]

甚至索引也会从数组的奇数索引中提取Obj1 Obj2 Obj3并获取Val1 Val2 Val3

或.. ..

您可以使用[|]拆分正则表达式,然后使用[:]将每个值拆分..将[0]存储在一个数组中,将[1]存储在另一个数组中。

修改

对于Obj的列表,您可以使用以下正则表达式进行拆分:

:\w+(?:\||$)

对于Val的列表,您可以使用以下正则表达式进行拆分:

(?:^|\|)\w+:

答案 2 :(得分:1)

使用命名匹配捕获来提取信息。下面的正则表达式获取键值(第一个)和值值(第二个)并最终创建键值对象。

string data ="Obj1:Val1|Obj2:Val2|Obj3:Val3";
string pattern = @"(?<Key>[^:]+):(?<Value>[^|]+)+\|?";

  Regex.Matches(data, pattern)
       .OfType<Match>()
       .Select (mt => new KeyValuePair<string,string>(mt.Groups["Key"].Value,  
                                                      mt.Groups["Value"].Value) );

请注意,KeyValuePair投影是可选的,您只需通过mt.Groups["Key"].Value自行提取信息。

以上是regex / linq投影的结果:

enter image description here

答案 3 :(得分:1)

您不需要正则表达式。使用Split和LINQ:

var str = "Obj1:Val1|Obj2:Val2|Obj3:Val3";
var arr = str.Split(new[] {'|',':'});
// And then either these 2 lines to get Objs and Vals into different arrays
var vals  = arr.Where((c,i) => i % 2 != 0).ToArray();
var objs = arr.Where((c,i) => i % 2 == 0).ToArray();
// Or into a key-value pair array
var key_value_array = 
     arr.Where((c, i) => i % 2 == 0)
        .Zip(arr.Where((c, i) => i % 2 != 0), 
             (key, value) => new KeyValuePair<string, string>(key, value))
        .ToArray();

输出:

enter image description here enter image description here enter image description here

答案 4 :(得分:0)

要获得Obj个匹配项,您可以拆分

:[^|]+(?:\||$)

通过以下方式获取Val字符串拆分

(^|\|)[^:]+: