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

用C中的RegEx提取字符串中逗号分隔的部分#

  •  2
  • NikolaiDante  · 技术社区  · 17 年前

    样本数据: !!第|123456部分,ABCDEF,ABC132!!

    逗号分隔的列表可以是字母和数字的任意组合中的任意数字

    我想要一个正则表达式来匹配逗号分隔列表中的条目:

    我所拥有的是: !!PART\|(\w+)(?:,{1}(\w+))*!!

    这似乎可以完成工作,问题是我想按顺序将它们检索到ArrayList或类似的数据中,所以在我想要的示例数据中:

    • 1 - 132456
    • 2-ABCDEF
    • 3-ABC123

    我的代码是:

    string partRegularExpression = @"!!PART\|(\w+)(?:,{1}(\w+))*!!"
    Match match = Regex.Match(tag, partRegularExpression);
    ArrayList results = new ArrayList();
    
    foreach (Group group in match.Groups)
    {
        results.Add(group.Value);
    }
    

    但这给了我意想不到的结果。我错过了什么?

    谢谢

    编辑: 一个解决方案是使用像!!这样的正则表达式!!第\|部分(\w+(?:,?\w+)*)!!捕获逗号分隔的列表,然后按照Marc Gravell的建议进行拆分

    不过,我仍然很想知道一个可用的正则表达式:o)

    4 回复  |  直到 16 年前
        1
  •  3
  •   ICR    17 年前

    您可以使用split:

    string csv = tag.Substring(7, tag.Length - 9);
    string[] values = csv.Split(new char[] { ',' });
    

    或者一个正则表达式:

    Regex csvRegex = new Regex(@"!!Part\|(?:(?<value>\w+),?)+!!");
    List<string> valuesRegex = new List<string>();
    foreach (Capture capture in csvRegex.Match(tag).Groups["value"].Captures)
    {
        valuesRegex.Add(capture.Value);
    }
    
        2
  •  1
  •   Marc Gravell    17 年前

    除非我错了,否则这仍然只算作一个群体。我猜你需要做一个字符串。拆分(',')才能做你想做的事?事实上,在这里根本不使用正则表达式看起来要简单得多。..根据数据,如何:

            if (tag.StartsWith("!!Part|") && tag.EndsWith("!!"))
            {
                tag = tag.Substring(7, tag.Length - 9);
                string[] data = tag.Split(',');
            }
    
        3
  •  1
  •   Martin Brown    17 年前

    我想你要找的RegEx是这样的:

    (?:^!!PART\|){0,1}(?<value>.*?)(?:,|!!$)
    

    然后可以这样运行

            string tag = "!!Part|123456,ABCDEF,ABC132!!";
    
            string partRegularExpression = @"(?:^!!PART\|){0,1}(?<value>.*?)(?:,|!!$)";
            ArrayList results = new ArrayList();
    
            Regex extractNumber = new Regex(partRegularExpression, RegexOptions.IgnoreCase);
            MatchCollection matches = extractNumber.Matches(tag);
            foreach (Match match in matches)
            {
                results.Add(match.Groups["value"].Value);
            }            
    
            foreach (string s in results)
            {
                Console.WriteLine(s);
            }
    
        4
  •  0
  •   ZombieSheep    17 年前

    以下代码

    string testString = "!!Part|123456,ABCDEF,ABC132!!";
    foreach(string component in testString.Split("|!,".ToCharArray(),StringSplitOptions.RemoveEmptyEntries) )
    {
        Console.WriteLine(component);
    }
    

    将给出以下输出

    Part
    123456
    ABCDEF
    ABC132
    

    这样做的好处是使字符串中逗号分隔的部分与您在原始问题(1,2,3)中指定的索引号(可能是意外错误的)相匹配。

    人酪氨酸羟化酶

    -EDIT-忘了说,如果每个字符串的格式不符合上述预期,这可能会有缺点,但同样,如果没有极其复杂的正则表达式,它也会很容易崩溃。