Шаблон регулярных выражений для NNNNNN-N

#regex

#регулярное выражение

Вопрос:

Я пытаюсь соответствовать шаблону, указанному в названии (NNNNNN-N), где N — цифра от 0 до 9. Я видел много частичных примеров, но не совсем то, что мне нужно. Я пытался [0-9]{6}-[0-9] но может пройти в 123456789-0, и он пройдет как действительный. Чего мне не хватает. Кстати, я не делал регулярных выражений уже 20 лет…

Комментарии:

1. 123456789-0 проходит, потому что он содержит 456789-0 — вы хотите, чтобы ваше регулярное выражение соответствовало всей строке или, возможно, соответствовало чему-либо после пробела. Пожалуйста, предоставьте пример кода и покажите, на каком языке вы ожидаете использовать регулярное выражение, поскольку это может повлиять на ответ. Также приведите репрезентативный пример ввода, поскольку неясно, что именно вы хотите сопоставить (а что нет).

2. Вам нужно привязать ваше регулярное выражение к границам строки. Помещается ^ впереди, чтобы соответствовать началу строки, и $ в конце, чтобы соответствовать концу строки: ^[0-9]{6}-[0-9]$

3. Я использую C #. Ввод может быть любым в диапазоне от 000000-0 до 999999-9; никогда никаких символов ни в одной позиции; в строке нет пробелов. После тестирования, ^[0-9]{6}-[0-9]$ работает на меня. Спасибо.

4. Вернемся к чертежной доске. Допустимый диапазон от 00000-0 до 999999-9. Думал, что смогу это сделать ^[0-9]{5}-[0-9]|[0-9]{6}-[0-9]$ , но он пропускает 12345-56 или 12345678-9. Ценю помощь. Спасибо.

5. Попробовал это: ^([0-9]{5}-[0-9])|([0-9]{6}-[0-9])$ но получил те же результаты…

Ответ №1:

Вам не хватает границы для вашего регулярного выражения. 123456789-0 соответствует, потому 456789-0 что соответствует вашему шаблону регулярных выражений.

Вот некоторые из ваших вариантов:

  1. граница слова b[0-9]{6}-[0-9]b .
  2. граница пробела s[0-9]{6}-[0-9]s .
  3. граница, не состоящая из цифр [^0-9][0-9]{6}-[0-9][^0-9] .
  4. граница строки ^[0-9]{6}-[0-9]$

Попробуйте это на Regex101

Вы заметите, что все они по-разному сочетаются с разными комбинациями. Вы также заметите, что для 2 и 3 он также соответствует символам с обеих сторон … yikes! Мы можем избежать этого, используя круглые скобки для формирования групп захвата вокруг интересующей нас части.

  1. нецифровая граница с группами захвата [^0-9]([0-9]{6}-[0-9])[^0-9] .

Попробуйте это на Regex101

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

Еще одна вещь, которую следует учитывать, — это использование идентификатора цифры, а не [0-9] . В python это будет d . Он соответствует не только [0-9], но для большинства английских вариантов использования это не имеет практического значения.