获取以逗号分隔的键值对的正则表达式

时间:2018-06-29 16:11:26

标签: c# regex regex-group

我想获取一个用逗号分隔的键值对的正则表达式。

输入:“ tag.Name:test,age:30,name:TestName123”

这是我到目前为止的尝试

string pattern = @".*:.*" 

(我想。*表示多次,如果后面加逗号,*:

string pattern = @".*:.*,*"

我认为这是同一回事,但对我而言不起作用,最终结果可以用Linq完成,但我不想解析输入

我的输出示例

输入

string input = "tags.tagName:Tag1,tags.isRequired:false"
var finaRes = input.Split(',').Select(x => x.Split(':')).Select(x => new { Key = x.First(), Value= x.Last()});

输出:

Key              Value
---------------|-------
tags.tagName   |  Tag1 
tags.isRequired|  false 

3 个答案:

答案 0 :(得分:1)

/([^,]+):([^,]+)/g相似的事物应该能够实现这一目标。请注意,这将在键和值中保留空格。

这将匹配每个键值对,每个匹配项将包含2个组,组1是键,而2是值。

这是一个有用的工具,可用于查看其工作方式和测试:https://regex101.com/r/m5KVfu/2

答案 1 :(得分:1)

您可以使用此正则表达式(演示名为here

(?<key>[^:]+):(?<value>[^,]+),?

说明:

(?<key>[^:]+) // this will match a 'key' - everything until colon char
(?<value>[^,]+) // this  will match a 'value' - everything until comma char

C#示例:

var regex = new Regex("(?<key>[^:]+):(?<value>[^,]+),?");
var input = "tag.Name:test,age:30,name:TestName123";

var matches = regex.Matches(input);

foreach (Match match in matches)
{
    Console.Write(match.Groups["key"]);
    Console.Write(" ");
    Console.WriteLine(match.Groups["value"]);
}

输出将是:

tag.Name test
age 30
name TestName123

Demo

答案 2 :(得分:0)

如果您可以接受冗长的正则表达式,这可能会有用:

((([a-zA-Z]*[0-9]*)*):([a-zA-Z0-9]+))(,([a-zA-Z]+[0-9]*)+:([a-zA-Z0-9]+))*

(([a-zA-Z]*[0-9]*)*) 键应以字母开头,可以以数字结尾,也可以不以数字结尾。

:冒号,键值分隔符

([a-zA-Z0-9]+):value 可以包含任意顺序的字母数字字符,+ 表示 value 是必须的。

,([a-zA-Z]+[0-9]*)+:([a-zA-Z0-9]+))? ?最后表示第二个键值对可能存在也可能不存在。

,([a-zA-Z]+[0-9]*)+ 第二个键应该从字母开始,可以以也可以不以数字结尾。

,末尾的 + 表示如果有逗号,则必须有第二个键。

:冒号,键值分隔符

([a-zA-Z0-9]+):第二个键的强制值

enter image description here