使用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)

您可以使用拆分:

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

或正则表达式:

 Regex csvRegex = new Regex(@"!!Part\|(?:(?\w+),?)+!!"); List valuesRegex = new List(); foreach (Capture capture in csvRegex.Match(tag).Groups["value"].Captures) { valuesRegex.Add(capture.Value); } 

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

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

我认为您正在寻找的RegEx是这样的:

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

然后可以像这样运行

  string tag = "!!Part|123456,ABCDEF,ABC132!!"; string partRegularExpression = @"(?:^!!PART\|){0,1}(?.*?)(?:,|!!$)"; 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); } 

以下代码

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