#regex
Вопрос:
Я хотел бы создать регулярное выражение, которое позволяет использовать следующие шаблоны:
1234
1234567
123456789
12345678900-
12345678900-123456
Должна быть возможность вставлять только цифры и разрешен только один дефис.
Я попробовал использовать следующее регулярное выражение:
^[0-9]{1,11}(?(?<=d{11})[-]?|)[0-9]{6}
Не должно быть 11 символов без дефиса в конце(12345678900 неверно).
К сожалению, это сработало не так, как я предполагал.
Комментарии:
1. Просто для ясности: дефис не может стоять перед 12-й цифрой? Кроме того, всегда ли после дефиса шесть или ноль цифр? Например,
1-1
разрешено ли? или1-
?2. да дефис должен быть 12-й цифрой
3. после дефиса всегда стоит шесть или ноль цифр, а 1-1 и 1 — не допускается.
Ответ №1:
Вы можете сопоставить 1-10 цифр и, при необходимости, 1 цифру, за которой следуют -
и 6 цифр.
^d{1,10}(?:d?-(?:d{6})?)?$
^
Начало строкиd{1,10}
Совпадение 1-10 цифр(?:
Группа без захватаd?-
Сопоставьте одну необязательную цифру и-
(?:d{6})?
Сопоставьте дополнительные 6 цифр
)?
Закройте группу без захвата и сделайте ее необязательной$
Конец строки
Демонстрация регулярных выражений
Другим вариантом может быть сопоставление 1-10 цифр или сопоставление 11 цифр с дефисом и, возможно, 6 цифр, если дефис возможен только после 11 цифр.
^(?:d{1,10}|d{11}-(?:d{6})?)$
Комментарии:
1. @JvdV Да, это действительно выглядит лучше. Это также должно соответствовать
12345678900-
2. Я попытался спросить ОП, не захочет ли он разрешить что-то подобное
1-123456
, но это все равно может быть делом, которое вам нужно осветить.3. @JvdV Да, именно поэтому я добавил второй шаблон.
4. @JvdV О да, иначе минимальное количество цифр равно 2 🙂 как у меня сейчас
5. Большое вам спасибо, ребята! регулярное выражение работает идеально!
Ответ №2:
Вы можете использовать
^[0-9]{1,11}(?:(?<=[0-9]{11})-(?:[0-9]{6})?)?$
^d{1,11}(?:(?<=d{11})-(?:d{6})?)?$
Смотрите демонстрацию регулярных выражений. Использование d
возможно в том случае, если оно соответствует цифрам ASCII в вашем типе регулярных выражений или вам все равно, d
соответствует ли оно всем возможным символам Юникода или нет.
Подробные сведения:
^
— начало строки[0-9]{1,11}
— от одной до одиннадцати цифр(?:(?<=[0-9]{11})-(?:[0-9]{6})?)?
— необязательное возникновение(?<=[0-9]{11})
— сразу слева должно быть 11 цифр-
— дефис(?:[0-9]{6})?
— необязательное вхождение шести цифр
$
— конец веревки.
Комментарии:
1. К вашему сведению: Если регулярное выражение используется для проверки ввода в реальном времени,
^[0-9]{1,11}(?:(?<=[0-9]{11})-(?:[0-9]{0,6})?)?$
можно использовать шаблон, единственная разница заключается в том, что он позволяет от нуля до шести цифр после-
конца строки.