Символ отрицания означает, что символ не может быть ничем в указанном классе. Ваше регулярное выражение намного сложнее, чем должно быть, и поэтому запутывает то, что вы действительно хотите.
Вы, вероятно, хотите что-то вроде этого:
^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}
на +
, чтобы просто захватывать числа независимо отмаксимальная длина.