Regex для необязательного совпадения с 3 цифрами в конце имени файла - PullRequest
1 голос
/ 06 марта 2019

Я не могу на всю жизнь понять, как заставить их соответствовать:

File name without 3 digit end.jpg
File name with 3 digit 123.gif
Single 123.jpg
Single.png

Но не это:

Single 1.jpg
Single 123b.gif
More words 123b.png

Лучшее, что я мог до сих пор, это выражение:

^[^\s]((?!\s{2})(?!,\S).)*\b(\p{L}+|\d{3})\.\w{3}$

Но он не соответствует Single.png и все еще соответствует Single 123b.gif и More words 123b.png. Я думаю, что понимаю, почему это не работает, но я не могу понять, как сделать это правильно, и я боролся и гуглил в течение 2 дней.

Мои полные правила: опционально ровно 3 цифры в конце перед расширением файла, трехбуквенное расширение файла, без двойных пробелов в имени файла и один пробел после, но не перед запятой.

Ответы [ 3 ]

2 голосов
/ 06 марта 2019

Вы можете использовать группу альтернатив, которая включает в себя либо 3 цифры, либо последовательность не цифр, перед которыми стоит утверждение границы слова:

^.*?\b(?:\d{3}|\D+)\.\w{3}$

Демо: https://regex101.com/r/A9iSVE/3

1 голос
/ 06 марта 2019

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

Вы можете использовать \s, если хотите сопоставить символ пробела вместо одного пробела.

^(?!.*[ ]{2})(?!.* ,).*\b(?:\p{L}+|\d{3})\.\w{3}$

Это будет соответствовать

  • ^ Началострока
  • (?!.*[ ]{2}) Не указывать 2 пробела
  • (?!.* ,) Не указывать ни одного пробела и запятой
  • .*\b Соответствует любому символу 0+ раз, за ​​которым следует словоГраница
  • (?:\p{L}+|\d{3}) Либо соответствует 1+ раз буквы или 3 цифры
  • \.\w{3} Совпадение . и 3 слова символов
  • $ Конец строки

Regex demo | C # демо

0 голосов
/ 07 марта 2019

Вы можете выполнять указанные правила без возврата (что делает принятый в настоящее время ответ).Указанные правила (перефразированы для ясности): имя файла ДОЛЖНО соответствовать следующим условиям:

  • НЕ ДОЛЖНО содержать последовательность из нескольких пробелов.
  • Запятая ДОЛЖНА иметь только одинпосле него следует пробел.
  • Строка имени файла МОЖЕТ иметь суффикс из 3 цифр.
  • Расширение имени файла ДОЛЖНО состоять из 3 букв.

Для этого:

^(?<prefix>[^, ]+(,? [^, ]+)*)(?<suffix>\d\d\d)?(?<extension>.\p{L}\p{L}\p{L})$

добьется цели, не задумываясь, не отступая.Разбившись на части, вы получите:

^                  # * match start-of-text, followed by
(?<prefix>         # * a named group, consisting of
  [^,\x20]+        #   * 1 or more characters other than comma or space, followed by
  (                #   * a group, consisting of
    ,?             #     * an optional comma, followed by
    \x20           #     * a single space character, followed by
    [^,\x20]+      #     * 1 or more characters other than comma or space
  )*               #     with the whole group repeated zero or more times
)                  #   followed by
(?<suffix>         # * an optional named group (the suffix), consisting of
  \d\d\d           #   * 3 decimal digits
)?                 #   followed by
(?<extension>      # * a mandatory named group (the filename extension), consisting of
  .\p{L}\p{L}\p{L} #   * 3 letters.
)                  #   followed by
$                  # end-of-text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...