Извлечь часть строки через запятую с помощью RegEx в C # - PullRequest
2 голосов
/ 15 декабря 2008

Пример данных: !! Часть | 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);
}

Но это дает мне неожиданные результаты. Чего мне не хватает?

Спасибо

Edit: Решением было бы использовать регулярное выражение типа !! PART \ | (\ w + (?:, ?? \ w +) *) !! захватить разделенный запятыми список, а затем разделить его, как это было предложено Марком Гравеллом

Мне все еще любопытно, какое рабочее регулярное выражение для этого: o)

Ответы [ 4 ]

3 голосов
/ 15 декабря 2008

Вы можете использовать сплит:

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 голос
/ 15 декабря 2008

Я думаю, что 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);
        }
1 голос
/ 15 декабря 2008

Если я не ошибаюсь, это по-прежнему считается только одна группа. Я предполагаю, что вам нужно сделать строку. Разделить (','), чтобы сделать то, что вы хотите? На самом деле, здесь гораздо проще не беспокоиться о регулярных выражениях ... В зависимости от данных, как насчет:

        if (tag.StartsWith("!!Part|") && tag.EndsWith("!!"))
        {
            tag = tag.Substring(7, tag.Length - 9);
            string[] data = tag.Split(',');
        }
0 голосов
/ 15 декабря 2008

следующий код

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- забыл упомянуть, у этого могут быть недостатки, если формат каждой строки не такой, как ожидалось выше, но с другой стороны, он будет прерываться так же легко без большого сложного регулярного выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...