Regex разделить на один и тот же символ в скобках - PullRequest
0 голосов
/ 12 марта 2020

У меня есть такая же длинная строка, например:

(A) name1, name2, name3, name3 (B) name4, name5, name7 (via name7) ..... (AA) name47, name47 (via name 46) (BB) name48, name49

В настоящее время я делю на "(", но он выбирает переход как новые строки)

string[] lines = routesRaw.Split(new[] { "  (" }, StringSplitOptions.RemoveEmptyEntries);

Как можно Я разделил информацию только в первых скобках? Нет AB, A C, AD и др. c. символы всегда одинаковы в скобках.

Спасибо.

1 Ответ

1 голос
/ 12 марта 2020

Вы можете использовать подход здесь, так как шаблон, который вам нужен, будет содержать группу захвата, чтобы иметь возможность соответствовать одному и тому же символу 0 или более раз, а Regex.Split выводит все захваченные подстроки вместе с несоответствиями.

Я предлагаю

(?s)(.*?)(?:\(([A-Z])\2*\)|\z)

Захватить все непустые значения группы 1. См. regex demo .

Подробности

  • (?s) - точка, RegexOptions.Singleline, которая позволяет . соответствовать тоже переводы строк
  • (.*?) - группа 1: любые 0 или более символов, но как можно меньше
  • (?:\(([A-Z])\2*\)|\z) - группа без захвата, которая соответствует:
    • \(([A-Z])\2*\) - (, затем группа 2 захватывает любую заглавную букву ASCII, затем 0 или более повторений этой захваченной буквы, а затем )
    • | - или
    • \z - самый конец строки.

В C#, используйте

var results = Regex.Matches(text, @"(?s)(.*?)(?:\(([A-Z])\2*\)|\z)")
        .Cast<Match>()
        .Select(x => x.Groups[1].Value)
        .Where(z => !string.IsNullOrEmpty(z))
        .ToList();

См. Демонстрационную версию C# онлайн .

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