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

时间:2008-12-15 13:32:47

标签: c# regex

示例数据: !!部分| 123456,ABCDEF,ABC132 !!

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

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

我拥有的是: !! 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);
}

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

由于

修改 一个解决方案是使用正则表达式!! PART \ |(\ w +(?:,?? \ w +)*)!!捕获逗号分隔列表,然后按照Marc Gravell

的建议拆分

我仍然对这方面的正则表达式很好奇:o)

4 个答案:

答案 0 :(得分:3)

您可以使用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);
}

答案 1 :(得分:1)

除非我弄错了,否则这只会算作一个群体。我猜你需要做一个string.Split(',')做你想做的事情?事实上,在这里根本不打扰正则表达式看起来简单得多......根据数据,如何:

        if (tag.StartsWith("!!Part|") && tag.EndsWith("!!"))
        {
            tag = tag.Substring(7, tag.Length - 9);
            string[] data = tag.Split(',');
        }

答案 2 :(得分:1)

我认为您正在寻找的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);
        }

答案 3 :(得分:0)

以下代码

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)中指定的索引号(可能意外错误)匹配。

HTH

-EDIT-忘了提一下,如果每个字符串的格式不像上面预期的那样,这可能有缺点,但是如果没有那么复杂的正则表达式那么它也会很容易打破。