我想获取一个用逗号分隔的键值对的正则表达式。
输入:“ 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
答案 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
答案 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]+)
:第二个键的强制值