【问题标题】:C# How to split (A:B=C)* using regex?C# 如何使用正则表达式拆分 (A:B=C)*?
【发布时间】:2009-06-25 07:35:23
【问题描述】:

这应该是一个非常简单的问题,但我似乎无法找到正确的解决方案。格式中有一个字符串:

A:B=C;D:E=F;G:E=H;...

而 A、B 和 C 是字母数字(可以是小写也可以是大写)。 A 和 B 的长度为 1+,C 可能为空。

我想我必须使用类似的东西

((?<A>.+):(?<B>.+)=(?<C>.*);)*

但我不知道如何以一种懒惰的方式使其匹配。我也不确定如何获得相应匹配的结果,所以我很感激一些代码示例。

如果你能给我一个提示,我会很高兴。

【问题讨论】:

  • (经过编辑以更清楚地指出代码的需要)

标签: c# regex lazy-evaluation


【解决方案1】:

正则表达式是必需的吗?由于字符串具有非常结构化的结构,因此无需正则表达式即可轻松解析它:

string input = "A:B=C;D:EF=G;E:H=;I:JK=L";
string[] elements = input.Split(new[] { ';' });
List<string[]> parts = new List<string[]>();
foreach (string element in elements)
{
    parts.Add(element.Split(new[] { ':', '=' }));
}
// result output
foreach (string[] list in parts)
{
    Console.WriteLine("{0}:{1}={2}", list[0], list[1], list[2]);
}

输出将是:

A:B=C
D:EF=G
E:H=
I:JK=L

【讨论】:

  • 当使用 Regex 的单行将为您提供已标有组的 Match 对象集合时,为什么还要拆分和弄乱列表?
  • 这不是必需的。我实际上在使用 string.split 但它似乎有点臃肿。
  • 只是呈现另一种方式;我有时会在不需要时看到使用正则表达式(我自己有罪)。有时不将新语言带到桌面上可能是一件好事。
  • 我也倾向于同意。我自己的 Regex-fu 足够弱,更喜欢使用字符串操作技术。
【解决方案2】:

您可以使用\w 匹配字母数字字符,而不是匹配所有内容的.。然后,您可能会尝试一次捕获一个匹配项:

(?<A>\w+):(?<B>\w+)=(?<C>\w*);

这是一个小例子:

Regex regex = new Regex("(?<A>\\w+):(?<B>\\w+)=(?<C>\\w*);");
string test = "A:B=C;D:E=F;G:E=H";

// get all matches
MatchCollection mc = regex.Matches(test);

foreach (Match m in mc) { 
    Console.WriteLine("A = {0}", m.Groups["A"].Value);
    Console.WriteLine("B = {0}", m.Groups["B"].Value);
    Console.WriteLine("C = {0}", m.Groups["C"].Value);
}

注意:有几种工具可以让您试验正则表达式并提供一些帮助;我个人很喜欢Expresso - 试试看,对学习很有用。

【讨论】:

  • 谢谢你的链接,我去看看!
【解决方案3】:
Regex r = new Regex("(?<A>\\w)+:(?<B>\\w)+=(?<C>\\w)*;");

\w 将匹配字母数字和下划线,相当于 [a-zA-Z0-9_]。

反斜杠在字符串中被转义,所以变成\ \w。

正则表达式捕获组 A、B 和 C,并将匹配 C 的 0 个或多个元素或由分号分隔的整个组。

您将拥有多个 Match 对象:

MatchCollection m = r.Matches(sampleInput);
// m[0] will contain A:B=C;
// m[1] will contain D:E=F;
// m[2] will contain G:E=H;
// ...

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多