【问题标题】:Get a regex expression for a key value pair separated by comma获取以逗号分隔的键值对的正则表达式
【发布时间】:2018-06-29 16:11:26
【问题描述】:

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

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

【问题讨论】:

  • @AleksAndreev 我没有看到您所指的 =,分隔符是冒号
  • @AleksAndreev 你是对的,我现在正在编辑那部分

标签: c# regex regex-group


【解决方案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

【讨论】:

  • 为什么要添加 角度?
  • @Heinrich 是命名组语法。它允许您使用有意义的名称而不是索引来提取组,从而生成更具表现力和更易于理解的代码。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    ((([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]+):值可能是容器任何顺序的字母数字字符,+ 表示值是必须的。

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

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

    , +最后表示如果有逗号则必须有第二个键。

    :冒号,键值分隔符

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

    【讨论】:

    • 您是否尝试过 OP 的输入:string input = "tags.tagName:Tag1,tags.isRequired:false"?我猜不是……
    • 我试图让答案尽可能通用。 KV 对“通常”以 key:value 格式存在。 OP 在 3 年前发布了这个,现在肯定已经找到了解决方案。遇到此答案的其他任何人都可能需要也可能不需要 label.key:value 格式。如果您不打算增强答案,请避免不必要的 cmets。
    • 您的回答不是“通用的”,因为它不适用于 OP 示例。接受的答案确实有效。 (([a-zA-Z]*[0-9]*)*) 肯定是“灾难性的回溯”。
    • 您介意看一下问题的标题吗?
    • 你介意读一下这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 2021-05-31
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多