使用正则表达式匹配属性

时间:2019-02-28 23:02:12

标签: c# regex

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

  

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

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

  1. AB = 0
  2. TX = 123
  3. TEST = LDAP
  4. USR =
  5. PROPS = 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. TEST = LDAP
  4. DN = VB,XN = P

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

您可以使用

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)-与两个选项之一匹配的非捕获组:
    • "([^"]*)"-一个",然后是"以外的0个或更多字符,然后是"
    • |-或
    • (\S+)\b-除空格以外的任意1个以上的字符,并尽可能多,直到单词边界位置为止。

请参见regex demo

string.Concat(match.Groups.Cast<Group>().Skip(1).Select(x => x.Value)).Trim()代码从组中删除了组0(完全匹配)值,将组1、2和3合并为一个字符串,然后进行修整。

C# test

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

答案 1 :(得分:0)

另一种方法是使用2个捕获组,其中第一组捕获包括等号的第一部分,第二组捕获等号后的值。

然后,您可以连接组并使用Trim删除双引号。如果您之后还要删除空格,则可以再次使用Trim。

([^=\s,]+=)("[^"]+"|[^,\s]+)

这将匹配

  • (第一个捕获组
    • [^=\s,]+=匹配1次以上而不是等号,逗号或空格字符,然后匹配=(如果属性名称可以包含逗号,则可以使用字符类并指定要使用的字符类允许匹配,例如[\w,]+
  • )关闭群组
  • (第二个捕获组
    • "[^"]+"从开始到结束的双引号匹配
    • |
    • [^,\s]+匹配1次以上,而不是逗号或空格字符
  • )

Regex demo | C# demo

您的代码可能如下:

public IEnumerable<string> SplitStr(string input)
{
    foreach (Match m in Regex.Matches(input, @"([^=\s,]+=)(""[^""]+""|[^,\s]+)"))
    {
        yield return string.Concat(m.Groups[1].Value, m.Groups[2].Value.Trim('"'));
    }
}