首页 > 解决方案 > 使用正则表达式匹配属性

问题描述

我有一个这样的字符串代表一组属性,例如:

AB=0,TX="123",TEST=LDAP,USR="",PROPS="DN=VB,XN=P"

我需要在以下位置提取此属性:

  1. AB=0
  2. 发送=123
  3. 测试=LDAP
  4. USR=
  5. 道具=DN=VB, XN=P

为了解决这个问题,我尝试使用正则表达式,但没有成功。

public IEnumerable<string> SplitStr(string input)
{
            Regex reg= new Regex("((?<=\")[^\"]*(?=\"(,|$)+)|(?<=,|^)[^,\"]*(?=,|$))", RegexOptions.Compiled);

            foreach (Match match in reg.Matches(input))
            {
                yield return match.Value.Trim(',');
            }
        }

我找不到预期输出的理想正则表达式。使用上述正则表达式,输出为:

  1. AB=0
  2. 123
  3. 测试=LDAP
  4. DN=VB, XN=P

任何人都可以帮助我吗?

标签: c#regex

解决方案


您可以使用

public static IEnumerable<string> SplitStr(string input)
{
    var matches = Regex.Matches(input, @"(\w+=)(?:""([^""]*)""|(\S+)\b)");
    foreach (Match match in matches)
    {
       yield return string.Concat(match.Groups.Cast<Group>().Skip(1).Select(x => x.Value)).Trim();
    }
}

正则表达式详细信息:

  • (\w+=)- 第 1 组:一个或多个单词字符和一个=字符
  • (?:""([^""]*)""|(\S+)\b)- 匹配以下两种选择之一的非捕获组:
    • "([^"]*)"- a ",然后是 0 个或多个字符",然后是 a"
    • |- 或者
    • (\S+)\b- 除空格之外的任何 1+ 字符,尽可能多,直到单词边界位置。

请参阅正则表达式演示

string.Concat(match.Groups.Cast<Group>().Skip(1).Select(x => x.Value)).Trim()代码从组中省略了 Group 0(全匹配)值,获取 Group 1、2 和 3 并将它们连接成一个字符串,然后对其进行修剪。

C# 测试

var s = "AB=0, TX=\"123\", TEST=LDAP, USR=\" \", PROPS=\"DN=VB, XN=P\"";
Console.WriteLine(string.Join("\n", SplitStr(s)));

输出:

AB=0
TX=123
TEST=LDAP
USR=
PROPS=DN=VB, XN=P

推荐阅读