Формат регулярного выражения для конкретного соответствия - PullRequest
0 голосов
/ 21 октября 2019

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

PA-123456-067_TY

Это всегда PA, за которым следует тире, 6 цифр, еще одна черточка, затем 3 цифры и оканчивается на _TY

По-видимому, когда я пишу это регулярное выражение в соответствии с указанным выше форматом, он правильно показывает вывод

^[^[PA]-]+-(([^-]+)-([^_]+))_([^.]+)

со всеми Символы отрицания ^

Это не сработает, если я напишу регулярное выражение в следующем формате без символов отрицания

[[PA]-]+-(([-]+)-([_]+))_([.]+)

Может кто-нибудь объяснить мне, почему это так?

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

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

Вы, вероятно, хотите что-то вроде этого:

^PA-(\d+)-(\d+)_TY$

.. ., который соответствует всему, что начинается с PA-, затем включает две группы чисел, разделенных чертой, затем подчеркивание и буквы TY. Если вы хотите, чтобы все, что после PA было тем, что вы захватили, но разделены на три группы, то это немного более абстрактно:

^PA-(.+)-(.+)_(.+)$

Это соответствует:

  • PA-
  • группа захвата любых символов
  • тире
  • другая группа захвата любых символов
  • знак подчеркивания
  • все оставшиеся символы до конца строки

Классы символов [...] говорят, что они соответствуют любому отдельному символу в списке, поэтому ваша первая группа захвата (([^-]+)-([^_]+)) ищетвсе, что не является тире любое количество раз, за ​​которым следует тире (что хорошо), за которым следует все, что не является подчеркиванием (опять же хорошо). Имея дополнительный набор круглых скобок, который создает другую группу захвата (вероятно, группу 1, так как это первые круглые скобки, достигнутые механизмом регулярных выражений) ... эта часть в порядке, но, вероятно, делает интерпретацию ответа менее интуитивной в этом случае.

При переписывании ваша первая группа захвата (([-]+)-([_]+)) совпадает с [-]+, что означает «одну или несколько черточек», за которыми следует тире, за которым следует любое количество подчеркиваний, за которыми следует подчеркивание. Поскольку ваш ввод не имеет тире сразу после PA-, все регулярные выражения не могут ничего найти.

Помещение PA во встроенные классы символов также усложняет задачу. Первая часть вашей первой ищет, ну, я не совсем уверен, как на практике интерпретируется [^[PA]-]+, но я подозреваю, что это что-то вроде «ни P, ни A, ни тире сколько угодно раз». Второй ищет противоположность, я думаю. Но вам не нужно ничего этого, вы просто хотите начать без чего-либо, кроме фактической последовательности символов, которая вас интересует, а это просто PA-.

Обновление: согласно пояснениям в комментарияхна исходный вопрос, зная, что вам нужны группы цифр фиксированного размера, это выглядело бы так:

^PA-(\d{6})-(\d{3})_TY$

Это захватывает PA-, затем 6-значное число, затемтире, затем трехзначное число, затем _TY. Шестизначные и трехзначные числа будут в группах захвата 1 и 2. соответственно.

Если размеры этих чисел могут когда-либо измениться, то замените {x} на +, чтобы просто захватывать числа независимо отмаксимальная длина.

1 голос
/ 21 октября 2019

согласно вашему комментарию это будет уместно PA-\d{6}-\d{3}_TY

РЕДАКТИРОВАТЬ: если вы хотите сопоставить строку, используйте ее с якорями: ^PA-\d{6}-\d{3}_TY$

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