我有一个类似这样的字符串,代表一组属性,例如:
AB = 0,TX =“ 123”,TEST = LDAP,USR =“”,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(',');
}
}
我找不到期望输出的理想正则表达式。使用上面的正则表达式,输出为:
有人可以帮助我吗?
答案 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合并为一个字符串,然后进行修整。
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次以上,而不是逗号或空格字符)
您的代码可能如下:
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('"'));
}
}