Измените эту проверку, чтобы изменить максимальную длину до 9, если строка не содержит тире - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь написать валидатор yup, который проверяет максимальную длину поля, в зависимости от того, включен ли da sh в строку. Если включено значение da sh, максимальная длина равна 10, а если значение da sh отсутствует, максимальная длина должна составлять 9.

Например:

'string-111' иметь максимальную длину 10.

'string111' должна иметь максимальную длину 9.

Мой текущий код выглядит так:

import * as Yup from 'yup';

export default Yup.object().shape({
  description: Yup.string()
    .matches(
      /^[a-zA-Z0-9-]*$/,
      'Invoice # can only contain letters, numbers and dashes'
    )
    .max(10, 'Invoice # has a max length of 10 characters'),
});

Я вижу документацию yup https://github.com/jquense/yup имеет метод .when(), но, похоже, он используется в очень специфических c случаях в своих примерах. Здесь пользователь может поместить da sh в любом месте строки.

Любые идеи о том, как переписать этот валидатор, чтобы при отсутствии значения da sh в строке максимальная длина составляла 9?

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

Вы можете сопоставить либо 10 символов, где дефис может быть найден в любом месте, используя позитивный lookahad, либо 9 символов, состоящих только из a-z0-9.

^(?:(?=[a-z0-9-]{10}$)[a-z0-9]*-[a-z0-9]*|[a-z0-9]{9})$

Объяснение

  • ^ Начало строки
  • (?: Группа без захвата
    • (?= Положительный взгляд вперед, утверждают, что справа -
      • [a-z0-9-]{10}$ Матч 10 раз a-z0-9 или - до конца строки
    • ) Закрыть взгляд
    • [a-z0-9]*-[a-z0-9]* Подберите дефис между символами a-z0-9
    • | или
    • [a-z0-9]{9} Подберите 9 символов a-z0-9
  • ) Закрыть группу
  • $ Конец строки

Regex demo

1 голос
/ 03 марта 2020

Я разработал решение, которое мне понравилось, но обнаружил, что оно уже было опубликовано @Thefourthbird, поэтому я попробовал другой способ и придумал следующее:

/^(?=(?:-*[^-]-*){9}$)(?=(?:[^-]*-[^-]*){0,1}$).*/gm

Вы можете видеть, что это регулярное выражение содержит два положительные взгляды , оба начинаются в начале строки. Первый гарантирует, что строка содержит 9 не дефисов; второй требует, чтобы был не более одного дефиса.

demo

Демонстрация предоставляет подробное и подробное объяснение того, как работает это регулярное выражение, но мы также можем сделать это самодокументирование путем записи в режиме свободного пробега :

/
^                      # match beginning of string
(?=                    # begin a positive lookahead
  (?:-*[^-]-*){9}      # match 9 strings, each with one char that is
                       # not a hyphen, possibly preceded and/or
                       # followed by hyphens
  $                    # match the end of a line
)                      # end positive lookahead

(?=                    # begin a positive lookahead
  (?:[^-]*-[^-]*){0,1} # match 0 or 1 strings, each containing one hyphen, 
                       # possibly preceded and/or followed by non-hyphens
  $                    # match the end of the string
)                      # end positive lookahead

.*                     # match 0+ characters (the entire string)
/gmx                   # global, multiline and free-spacing regex
                       # definition modes

При желании [^-] можно заменить на [a-zA-Z0-9], \p{Alnum} или что-то еще, в зависимости от требований .

...