繁体   English   中英

C#:如何使用正则表达式匹配字符串'@ A = 1,@ B = 2,@ C = 3,...”

[英]C#: How to use regex to match string '@A=1, @B=2, @C=3, …"

我有这样的字符串。

@ A1 = 1,@ B1 = 2,@ C1 = 3,@ D2 = 4123,@ D3 = 'asdsd',...

字符串长度是不确定的。

如何使用正则表达式获取每个变量名称的值?

预期结果是

A1是1

B1是2

C1是3

这是我的初始代码,但这似乎不起作用。

Regex exp = new Regex(@"((@[\w]+=('.+'|[\d\.]+),?)+?)+");
GroupCollection gc = exp.Match(strArg).Groups;
string txt = @"@A1=1,@B1=2,@C1=3,@D2=4123,@D3='asdsd'";
string patten = @"@([^=]*)=([^,]*)";
foreach (Match m in Regex.Matches(txt, patten))
{
    Console.WriteLine(string.Format("{0} is {1}", m.Groups[1].Value, m.Groups[2].Value));
}

这是一个例子

对于每个分组(..)构造, 创建一次 -这与实际“重复”(例如,用+ )一个组以匹配Regex#Match调用中的输入的次数无关

要使用正则表达式直接解决此问题,请-

  • 使用“全局匹配”( Regex#Matches ),删除正则表达式中的repeat-group修饰符,然后让正则表达式的重新应用找到每个组(这将产生一匹配结果,每个结果都具有相同的一组基团); 要么

  • 手动为每个 @letter ..构造创建一个硬编码组。 (这仅适用于一组固定的字段,但是很快就会变得笨拙。)

另外,如果可能的话-

  • 首先使用String#Split (或Regex#Split )简化问题,然后处理生成的零件序列。

WRT“似乎无法正常工作”有几个直接的问题,而忽略了前面提到的分组问题,其他问题,并由Joel在评论中提出-

  • 正则表达式不走位后,考虑(也许这只是在标题有误?)

  • 多个字符串会轻易破坏它,因为'.+'是贪婪的,并且会“吞噬”某些参数对

如果没有实际的输入和实际的 “无效”数据,则很难进一步说明/解释它。 在任何情况下,都可以在实施“全局匹配”方法的同时解决这两个问题-fsvo。

这是我迅速表达的正则表达式。 不过,它不支持引号中的逗号。

@(\w+)=(.*?)(?:,|$)

Regex101

@([^=]*)\s*=\s*(.*?)(?=,|$)

您可以简单地尝试一下。请参阅演示。

https://regex101.com/r/uF4oY4/19

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM