Как сделать только одну группу с 2-мя захватами - PullRequest
1 голос
/ 20 марта 2019

У меня есть что-то вроде этого

Дата, номер; Ярлык; дебет; кредит; более;

Я пытаюсь сделать регулярное выражение, которое собирается создать группу с датой, меткой, дебетом или кредитом

есть пример:

Дата, номер; Ярлык; Дебет ;; больше;

но это может быть:

Дата, номер; Ярлык ;; кредита; более;

Поэтому я пытаюсь получить только 3 группы (это не может быть Кредит и Дебет на одной линии)

Я пробую это, но это не работает:

(.*);(?:.*);(.*);{1,2}(.*);{1,2}(?:.*);

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Не следует использовать .*, так как он соответствует любому символу, и вы не хотите совпадать с точкой с запятой, вместо этого используйте [^.]*, который соответствует всем символам, кроме точек с запятой.

Полученное регулярное выражение будет ([^;]*);(?:[^;]*);([^;]*);{1,2}([^;]*);{1,2}(?:.*);

См. здесь .

0 голосов
/ 20 марта 2019

Одним из вариантов может быть использование 3 групп захвата.Если совпадение находится на левой стороне третьей группы, вы можете захватить его, используя группу и совпадение после;используя отрицательный класс символов .

Если совпадение находится справа, сначала можно указать дополнительную точку с запятой:

^([^;]*);[^;]*;([^;]*);;?([^;]*)
  • ^ Начало строки
  • ([^;]*); Группа1 - совпадение не ;, затем ;
  • [^;]*; Нет группы, совпадение отсутствует;затем;
  • ([^;]*); Группа 2 - не соответствует ;, затем ;
  • ;?([^;]+) Группа 3, соответствует необязательной точке с запятой, затем захват в группу, не соответствующую ;

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

Если вы также не разрешите использование содержимого между точками с запятой, вы можете использовать [^;]* вместо.

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