Регулярные выражения для соответствия 3 конкретным местам строки - PullRequest
1 голос
/ 24 апреля 2019

Я застрял, пытаясь найти способ получить 3 раздела строки, не используя разбиение и некоторые странные вещи.Целевая строка выглядит следующим образом:

BLABLABLABLABLABLA BLABLABLA - BLABLA BLABLA (BLABLA1 BLABLA2)

Мне нужно извлечь три части следующим образом:

1) BLABLABLABLABLABLA BLABLABLA (левая часть)

2) BLABLA BLABLA(средняя часть)

3) BLABLA1 BLABLA2 (правая часть в скобках)

То, что я сейчас сделал, это:

var text = "BLABLABLABLABLABLA BLABLABLA - BLABLA BLABLA (BLABLA1 BLABLA2)";

var left = Regex.Matches(text, @"([^)]*)-");
var middle = Regex.Matches(text, @"-([^)]*)\(");
var right = Regex.Matches(text, @"\(([^)]*)\)");

Console.WriteLine(left[0]);
Console.WriteLine(middle[0]);
Console.WriteLine(right[0]);

Вывод:

BLABLABLABLABLABLA BLABLABLA -
- BLABLA BLABLA (
(BLABLA1 BLABLA2)

Кажется, что работает, но вывод содержит разделители, и я просто хочу необработанное содержимое.

1 Ответ

3 голосов
/ 24 апреля 2019

Вы можете использовать это единственное регулярное выражение и получить все три значения из трех групп,

^(.+)\s+-\s+(.+)\s+\(([^()]+)\)$

Пояснение:

  • ^ - соответствует началу ввода
  • (.+) - Соответствует и захватывает любой символ один или несколько раз и останавливается перед пробелом (ами) и дефисом и помещается в группу 1
  • \s+-\s+ - Соответствует пробелам, за которыми следуют дефис - и снова пробелы, и исключает их из участия в захвате любой группы, поскольку они не требуются
  • (.+) - Соответствует следующей последовательности символов один или несколько и захватывает в group2
  • \s+\( - соответствует одному или нескольким пробелам, за которыми следует литерал (
  • ([^()]+) - соответствует одному или нескольким символам, отличным от ( или ), и захватывает в группе 3
  • \)$ - сопровождается литералом ) и концом строки

Regex Demo

C # Код демо

var text = "BLABLABLABLABLABLA BLABLABLA - BLABLA BLABLA (BLABLA1 BLABLA2)";

var match = Regex.Match(text, @"^(.+)\s+-\s+(.+)\s+\(([^()]+)\)$");
Console.WriteLine("left: " + match.Groups[1].Value);
Console.WriteLine("middle: " + match.Groups[2].Value);
Console.WriteLine("right: " + match.Groups[3].Value);

печать

left: BLABLABLABLABLABLA BLABLABLA
middle: BLABLA BLABLA
right: BLABLA1 BLABLA2

Edit: Согласно вашему комментарию, если последняя часть строки, которая содержится в скобках, может быть необязательной, то вы можете использовать это регулярное выражение, где третья группа является необязательной.

^(.+)\s+-\s+(.+?)\s*(?:\(([^()]+)\))?$

Демонстрация регулярных выражений с необязательной группой 3

Обновленная демоверсия C #

var text = "BLABLABLABLABLABLA BLABLABLA - BLABLA BLABLA (BLABLA1 BLABLA2)";

var match = Regex.Match(text, @"^(.+)\s+-\s+(.+)\s+\(([^()]+)\)$");
Console.WriteLine("left: " + match.Groups[1].Value);
Console.WriteLine("middle: " + match.Groups[2].Value);
Console.WriteLine("right: " + match.Groups[3].Value);

text = "BLABLABLABLABLABLA BLABLABLA - BLABLA BLABLA";

match = Regex.Match(text, @"^(.+)\s+-\s+(.+?)\s*(?:\(([^()]+)\))?$");
Console.WriteLine("\nleft: " + match.Groups[1].Value);
Console.WriteLine("middle: " + match.Groups[2].Value);
Console.WriteLine("right: " + match.Groups[3].Value);

печать

left: BLABLABLABLABLABLA BLABLABLA
middle: BLABLA BLABLA
right: BLABLA1 BLABLA2

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