regex: поиск шаблона чередующихся чисел и строк - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь найти следующий шаблон:

(ЧИСЛА) (STRING) (ЧИСЛА) (STRING) (ЧИСЛА) (STRING)

хотя бы с одной группой ( ЧИСЛА) (STRING) присутствует. Я также хочу получить в совпадении номер и строку отдельно.

Пример:

1234abc234qwy2342nioo
23oin234noik32342noi
234nio234koi2341nio

Вывод, который я хочу получить, следующий:

  1. 1234 , ab c, 234, qwy, 2342, nioo
  2. 23, oin, 234, noik, 32342, noi

Однако, если на входе есть только число, я не хочу, чтобы он совпадал с шаблоном.

Я придумал следующее регулярное выражение:

^(\d*)([a-z]*)(\d*)([a-z]*)(\d*)([a-z]*)$

Пример регулярного выражения

Однако, теперь он фиксирует, если я дам ему один номер. Например, он соответствует следующим шаблонам:

2342324

Можно ли навязать регулярному выражению, что оно захватывает хотя бы одну группу (NUMBERS) (STRINGS) и не соответствует только цифры.

Ответы [ 2 ]

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

Проблема в том, что вы используете *, что означает ноль или более. Другими словами, если вы используете *, это по сути необязательно. + означает один или более, так что это более уместно в вашем случае. Например:

^(\d+[a-z]+){1,3}$

Или, если вы хотите сохранить группы захвата:

^(?:(\d+)([a-z]+)){1,3}$

Или:

^(\d+)([a-z]+)(?:(\d+)([a-z]+))?(?:(\d+)([a-z]+))?$
0 голосов
/ 04 марта 2020

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

/(?:(?<=\D)\d+|\d+(?=\D))|\D+/ 

Это будет соответствовать чередующимся подстрокам только цифр и только не цифр, при условии, что строка содержит хотя бы один не-ди git символ. Если в строке есть только цифры, совпадение не производится. Если есть хотя бы один не-ди git символ, будет одно или несколько совпадений не цифр и ноль или более совпадений цифр.

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

/
(?:        # begin a non-capture group
  (?<=\D)  # next match is preceded by a non-digit character
  \d+      # match 1+ digits
  |        # or
  \d+      # match 1+ digits      
  (?=\D)   # previous match is followed by a non-digit character
)          # end non-capture group
|          # or
\D+        # match 1+ non-digit characters 
/x         # free-spacing regex definition mode

(?<=\D) является положительным взглядом . (=\D) является положительным прогнозом .

Если, кроме того, не должно быть никакого совпадения, если строка содержит только не-di git символы, регулярное выражение будет изменено на следующее:

/(?:(?<=\D)\d+|\d+(?=\D))|(?:(?<=d)\D+|\D+(?=\d))/ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...