Регулярное выражение для дополнительных символов - PullRequest
0 голосов
/ 03 июля 2018

Мне нужно проверить путь к файлу. В одной из каталогов может быть номер версии.

Ниже приведены два возможных пути, с которыми я могу столкнуться.

Путь 1

File path = "/a/b/c/d_9000/p1=<val1>/p2=<val2>/p3=<val3>/<val4>"

Ожидаемый результат

Group 1 = d
Group 2 = 9000
Group 3 = val1
Group 4 = val2
Group 5 = val3
Group 6 = val4

Путь 2

File Path = "/a/b/c/d/p1=<val1>/p2=<val2>/p3=<val3>/<val4>"

Ожидаемый результат

Group 1 = d
Group 2 = <null or empty string>
Group 3 = val1
Group 4 = val2
Group 5 = val3
Group 6 = val4

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

Вот что я пробовал

\/a\/b\/c\/(\w+)_([0-9]+)\/p1=(.*)\/p2=(.*)\/p3=(.*)\/(.*)

Но это не дает мне правильные значения для Group1 и Group 2

Я пытался добавить '?' после подчеркивания, но это тоже не помогает.

Пожалуйста, помогите

1 Ответ

0 голосов
/ 03 июля 2018

Проблема в том, что \w соответствует буквам, цифрам или _. Он количественно определяется с помощью +, жадного квантификатора, и, следовательно, делает необязательным следующий соседний шаблон, совпадающий с пустой строкой перед несоответствующим текстом. (\w+)_?([0-9]+)\/ будет захватывать все буквы, цифры, _ до / в d_9000/, и только последняя 0 попадет в Группу 3, поскольку [0-9]+ должен соответствовать хотя бы 1 цифре.

Вы можете исключить _ из \w, используя [^\W_], и сделать шаблон _([0-9]+) необязательным, обернув его необязательной группой без захвата:

\/a\/b\/c\/([^\W_]+)(?:_([0-9]+))?\/p1=(.*)\/p2=(.*)\/p3=(.*)\/(.*)
            ^^^^^^^ ^^^         ^^   

См. это демо регулярных выражений .

Или, сделайте \w ленивым, а не вычитайте _ из \w (если может быть _, отличное от того, что перед цифрами, которые вам нужно захватить):

\/a\/b\/c\/(\w*?)(?:_([0-9]+))?\/p1=(.*)\/p2=(.*)\/p3=(.*)\/(.*)
            ^^^^

См. еще одну демонстрацию регулярных выражений .

enter image description here

...