Ограничить только части регулярного выражения, а не само выражение целиком? - PullRequest
1 голос
/ 09 июля 2020

, так что у меня есть поле ввода, где клиент может вводить числа от 1 до 10 длиной с подстановочным знаком с как минимум 1 номером в качестве префикса. (* не допускается, а 1 * будет)

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

^([ ,;]?(?=.{1,10}$)((\d{1,9})(\*?)(\d{0,9}?))[ ,;]?)$

Теперь проблема. Как вы можете видеть в выражении, разделители ПРОБЕЛ, ЗАПЯТАЯ и ПОЛУ-ТОЛЧКА разрешены в начале или в конце строки, потому что клиент может вводить несколько чисел в этой комбинации. [ ,;]?

Но он не может из-за максимальной длины 10 (?=.{1,10}$). С другой стороны, если я удалю ограничение максимальной длины, вы сможете ввести одно число длиннее 10 (ровно максимум 19 символов прямо сейчас) 123456789*123456789 -> будет разрешено без ограничений.

Есть ли каким-либо способом ограничить выражение таким образом, что длина символа между разделителями должна быть 10 абсолютных максимальных длин, но в целом максимальная длина может быть больше для ввода большего числа чисел?

1 Ответ

1 голос
/ 09 июля 2020

Может быть:

^(?:\d(?=\d*\*?\d*(?:[ ,;]|$))[\d*]{0,9}(?:[ ,;]|$))+$

См. Онлайн демо

Поскольку вы хотите начинать число как минимум с одного di git, следующее будет match;

  • ^ - начало строки ancor.
  • (?: - открыть 1-ю группу без захвата.
    • \d - сопоставить один di git.
    • (?= Открыть положительный просмотр вперед.
      • \d*\*?\d* - Любое количество цифр, необязательный подстановочный знак и снова любое количество цифр (чтобы разрешить только один подстановочный знак).
      • (?: - Открыть вложенный второй не захват группа.
        • [ ,;]|$ - сопоставить любой из символов в классе символов или , затем конец строки.
        • ) - закрыть второй группа без захвата.
      • ) - закрыть положительный просмотр вперед.
    • [\d*]{0,9} - сопоставить символы 0-9 из класса символов (цифры или символы подстановки).
    • (?: - открыть 3-ю группу без захвата.
      • [ ,;]|$ - сопоставить любой из символов в классе символов или , затем конец строки.
      • ) - закрыть третий не захватывающая группа.
    • ) - закрыть 1-ю группу без захвата.
  • + - повторить 1-ю группу без захвата хотя бы один раз.
  • $ - Конечная строка ancor.

EDIT1 : Вышеупомянутое позволит использовать запятую, точку с запятой или пробел в конце. Если вы хотите избежать этого, вы можете использовать:

^(?:\d(?=\d*\*?\d*[ ,;])[\d*]{0,9}[ ,;])*\d(?=\d*\*?\d*$)[\d*]{0,9}$

См. Онлайн демонстрацию

EDIT2 : Вышеупомянутое позволяет использовать только один подстановочный знак на номер. Если ваше намерение было таково, что несколько должно быть разрешено (но просто не одно за другим, вы можете попробовать:

^(?:\d(?!.*\*\*.*[ ,;])[\d*]{0,9}[ ,;])*\d(?!.*\*\*.*$)[\d*]{0,9}$

См. Онлайн демонстрацию

EDIT3 : если по какой-то причине вы решите, что do хотите разрешить последовательные подстановочные знаки (но все равно начинайте хотя бы с одного di git), вы можете выбрать:

^(?:\d[\d*]{0,9}[ ,;])*\d[\d*]{0,9}$

Посмотреть онлайн демо

...