簡體   English   中英

在C#中使用RegEx提取字符串的逗號分隔部分

[英]Extract comma separated portion of string with a RegEx in C#

樣本數據:!! Part | 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);
}

但這給了我意想不到的結果。 我想念什么?

謝謝

編輯:一種解決方案是使用正則表達式,如!! PART \\ |(\\ w +(?:,?? \\ w +)*)!! 捕獲逗號分隔的列表,然后按照Marc Gravell的建議進行拆分

我仍然對此感到滿意的正則表達式:o)

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

除非我弄錯了,否則那僅算作一組。 我猜你需要做一個string.Split(',')做你想做的嗎? 確實,在這里完全不用理會正則表達式看起來要簡單得多...根據數據,如何:

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

我認為您正在尋找的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);
        }

以下代碼

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-忘了提一下,如果每個字符串的格式都沒有達到上面的預期,這可能會有缺點,但是如果沒有非常復雜的正則表達式,它也會同樣容易損壞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM