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

Get a regex expression for a key value pair separated by comma

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

输入:"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 

类似 /([^,]+):([^,]+)/g 的东西应该能够实现这一点。请注意,这将允许键和值中有空格。

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

这是一个有用的工具,您可以使用它来查看其工作原理并进行测试:https://regex101.com/r/m5KVfu/2

您可以使用这个正则表达式(演示是 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

如果您不介意冗长的正则表达式,这可能会有用:

((([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]+):第二个键的强制值