Primefaces keyFilter не соответствует всем значениям, определенным в регулярном выражении

Я пытаюсь ограничить ввод с помощью Primefaces keyFilter, чтобы он соответствовал всем числам от 1 до 99, используя регулярное выражение. Вот что у меня есть на данный момент:

<p:inputText id = "inNum" maxlength = "2">
    <p:keyFilter regEx = "/^[1-9][0-9]?$/" preventPaste = "true" />
</p:inputText>

Ввод принимает большинство желаемых чисел, кроме тех, которые имеют 0 в качестве второй цифры (10, 20, 30,..).

Не могу понять, почему так. Я также проверил это регулярное выражение с помощью онлайн-тестеров, и, похоже, все в порядке.

Что мне здесь не хватает?

Это просто означает, что вы можете проверить только одно нажатие клавиши с помощью регулярного выражения, и, поскольку для этого требуется ненулевая цифра в качестве первого символа, она позволит использовать только цифру от 1 до 9. Вам нужно проверить все входное значение с помощью регулярного выражения .

Wiktor Stribiżew 18.05.2023 11:11

@WiktorStribiżew Я уже думал об этом, поэтому попробовал с атрибутом inputRegEx. В документации для inputRegEx указано: Определяет регулярное выражение, которое следует использовать для проверки всего входного текстового содержимого. Вроде так можно ввести 10, 20, 30... но есть еще одна проблема. Как только я вхожу, например. 10, а затем я пытаюсь очистить ввод, первая цифра (1 в моем случае) не может быть очищена. Не знаю почему, но это не то поведение, которое я хочу.

peterremec 18.05.2023 11:45

Да, тогда вам нужно сделать их оба (последовательно) необязательными. Попробуйте inputRegEx='/^(?:[1-9][0-9]?)?$/'

Wiktor Stribiżew 18.05.2023 11:51

@WiktorStribiżew это именно то, что я искал, большое спасибо. Не стесняйтесь опубликовать свое решение в качестве ответа на мой вопрос.

peterremec 18.05.2023 12:42

Отвечает ли это на ваш вопрос? Использование регулярного выражения с p:keyFilter

Jasper de Vries 18.05.2023 18:00

@JasperdeVries да, частично, я понял, что должен использовать атрибут inputRegEx. Ответ Виктора, наконец, решил мою проблему с ограничением ввода - также мое регулярное выражение было неполным.

peterremec 26.05.2023 14:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Атрибут regEx проверяет только одно нажатие клавиши с помощью своего регулярного выражения, а поскольку шаблон ^[1-9][0-9]?$ требует ненулевой цифры в качестве первого символа, он позволит использовать только цифру от 1 до 9. Вам нужно проверить все входное значение с помощью inputRegEx атрибут.

Вы можете использовать

inputRegEx='/^(?:[1-9][0-9]?)?$/'

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

Подробности

  • ^ - начало строки
  • (?:[1-9][0-9]?)? - необязательная последовательность
    • [1-9] - ненулевая цифра
    • [0-9]? - необязательная цифра
  • $ - конец строки.

Другие вопросы по теме