C# 用C中的正则表达式提取字符串的逗号分隔部分#

C# 用C中的正则表达式提取字符串的逗号分隔部分#,c#,regex,C#,Regex,样本数据: !!第123456部分,ABCDEF,ABC132 逗号分隔的列表可以是字母和数字的任意组合中的任意数字 我想要一个正则表达式来匹配逗号分隔列表中的条目: 我得到的是: !!部分\|(\w+)(:,{1}(\w+))* 这似乎完成了工作,问题是我想将它们按顺序检索到ArrayList或类似的示例数据中,我希望: 1-132456 2-ABCDEF 3-ABC123 我的密码是: string partRegularExpression = @"!!PART\|(\w+)(?:,{

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

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

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

我得到的是: !!部分\|(\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)

除非我弄错了,否则它仍然只算作一个组。我猜你需要做一个string.Split(',')来做你想做的事?事实上,在这里不使用正则表达式看起来简单多了。。。根据数据,以下情况如何:

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

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


-编辑-忘了提及,如果每个字符串的格式与上面所预期的不一样,这可能会有缺点,但是如果没有非常复杂的正则表达式,它也会很容易被破坏。

我认为您正在寻找的正则表达式是:

(?:^!!PART\|){0,1}(?<value>.*?)(?:,|!!$)
(?:^!!部分\|){0,1}(?.*?(:,|!!$)
然后可以这样运行

        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);
        }
string tag=“!!Part | 123456,ABCDEF,ABC132!!”;
字符串partRegularExpression=@“(?:^!!PART\|){0,1}(?.*?(:,|!!$)”;
ArrayList结果=新建ArrayList();
Regex extractNumber=newregex(partRegularExpression,RegexOptions.IgnoreCase);
MatchCollection matches=extractNumber.matches(标记);
foreach(匹配中的匹配)
{
结果.添加(match.Groups[“value”].value);
}            
foreach(结果中的字符串s)
{
控制台。写入线(s);
}

您可以使用拆分:

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);
}
Regex csvRegex=新的Regex(@“!!Part\ |(?:(?\w+)+!!”);
列表值regx=新列表();
foreach(在csvRegex.Match(tag).Groups[“value”]中捕获捕获。捕获)
{
valuesregx.Add(capture.Value);
}

您的数据是否总是与此相似?这里对正则表达式的需求并不是很明显。您可以解析感叹号,用“|”拆分,然后用逗号再次拆分,以立即生成数组。确实要使用正则表达式吗?“有些人在遇到问题时,会想‘我知道,我会使用正则表达式。’现在他们有两个问题。”很好的引语:o) 我用正则表达式做了很多(当然更简单)标记,但效果很好,所以当我点击这一个时,我继续沿着这条路线。数据将类似,开始和结束将是相同的,逗号分隔的列表可以有一到x个条目。没有捕获(?:)括号,只有里面的组(\w+)而已。但没有理由不可能。我想我把事情复杂化了,100%正则表达式。一个正则表达式的形式:!!部分\|(\w+(?:,?\w+*)!!似乎只捕获逗号分隔的列表。然后我可以把一组人分开(如果需要的话)。是的,应该是0,1,2。哦o) 我有一个单独的标签验证正则表达式,所以当我提取数据时,它已经被验证过了,但是感谢大家的提醒o) 这个案子失败了!!第| 123456部分!!在数组列表中,我有两个条目“!!”和“”,您需要以稍微不同的方式运行它,请参阅我添加的示例代码。只需对其进行单元测试,就可以全部通过。谢谢:o)有趣的是,这个正则表达式解决方案比我的略快。和往常一样,分割版本是最快的。在100万次迭代中,我的正则表达式得到0.54秒,这一次得到0.44秒,分割得到0.10秒。两个正则表达式都是编译的。首先,正则表达式使用非贪婪的通配符匹配,这需要相当多的回溯。