代码之家  ›  专栏  ›  技术社区  ›  mafu

C如何使用regex拆分(A:B=C)*

  •  1
  • mafu  · 技术社区  · 16 年前

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

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

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

    我想我得用一些符合

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

    但我不知道如何让它以一种懒惰的方式匹配。我也不知道如何获得相应匹配的结果,所以我希望获得一些代码示例。

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

    3 回复  |  直到 16 年前
        1
  •  4
  •   Paolo Tedesco    16 年前

    你可以使用 \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 -试试看,这对学习很有用。

        2
  •  5
  •   Fredrik Mörk    16 年前

    Regex是一项要求吗?由于字符串具有非常结构化的结构,因此不使用regex很容易对其进行解析:

    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
    
        3
  •  2
  •   Jeff Meatball Yang    16 年前
    Regex r = new Regex("(?<A>\\w)+:(?<B>\\w)+=(?<C>\\w)*;");
    

    \w将匹配字母数字和下划线,相当于[a-za-z0-9_uu]。

    反斜杠在字符串中转义,因此变为\\w。

    regex捕获组A、B和C,并将匹配C的0个或多个元素或用分号分隔的整个组。

    您将有多个匹配对象:

    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;
    // ...