Регулярное выражение позитивный взгляд сзади

#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})?)?$ можно использовать шаблон, единственная разница заключается в том, что он позволяет от нуля до шести цифр после - конца строки.