我有一个在数组中拆分两次的字符串。这是一个例子:
Obj1:Val1|Obj2:Val2|Obj3:Val3
请帮我使用正则表达式来获取第一个字符串的数组:
Obj1
Obj2
Obj3
然后另一个正则表达式获取
Val1
Val2
Val3
我不想迭代。我想一次性使用正则表达式的结果。
答案 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投影的结果:
答案 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();
输出:
答案 4 :(得分:0)
要获得Obj
个匹配项,您可以拆分:
:[^|]+(?:\||$)
通过以下方式获取Val
字符串拆分:
(^|\|)[^:]+: