Как написать регулярное выражение для соответствия символов, разделенных 3 косыми чертами? - PullRequest
1 голос
/ 11 февраля 2020

любая строка может быть внутри косой черты, но должно быть только 3 деления. Например, значения, которые должны совпадать:

  1. "90/90/90/9090"
  2. "FDSAFDSA / 90 / pppppaA3 / 9090"

Значения, которые не должны совпадать:

  1. "90/90/90/9090/90"
  2. "FDSAFDSA / 90 / pppppaA3 / 9090/90"

Я использую python и библиотеку re, я пробовал много комбинаций, но ни одна из них не работала:

 bool(re.match(r'^.*\/.*\/.*\/((?!\/).)*$', "90/90/90/9090/90"))
 bool(re.match(r'^.*\/.*\/.*\/((?!/).)*$', "90/90/90/9090/90"))
 bool(re.match(r'^.*\/.*\/.*\/(?!(/)$).*$', "90/90/90/9090/90"))
 bool(re.match(r'^.*\/.*\/.*\/(/).*$', "90/90/90/90/90"))
 bool(re.match(r'^.*\/.*\/.*\/.*(\/)$', "90/90/90/90/90"))

1 Ответ

5 голосов
/ 11 февраля 2020

Вы должны использовать классы отрицательных символов :

^[^/]*/[^/]*/[^/]*/[^/]*$

[^/] соответствует любому символу, кроме /, поэтому мы представляем строку, содержащую три / и все еще вокруг них.

В ваших регулярных выражениях . может совпадать с чем угодно, включая /, и хотя вы могли бы приблизить эквивалент отрицательных классов символов, используя отрицательные обратные выражения, вы не применили их должным образом к каждый ., который у вас был: ^((?!\/).)*\/((?!\/).)*\/((?!\/).)*\/((?!\/).)*$ тоже работал бы, хотя он был бы менее производительным.

И не нужно избегать этих /, они не являются метасимволами регулярных выражений. Вам может понадобиться экранировать их в языках или инструментах, которые используют / в качестве разделителей, таких как синтаксис JavaScript * /pattern/ или подстановки s/search/replace/ в sed.

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