Regex для трех букв и четырех чисел? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть это регулярное выражение, которое я должен создать, которое принимает следующие форматы:

  1. Любые 3 буквы (без учета регистра, никаких других символов, кроме буквенных символов)
  2. Любые2 буквы с тире между ними (без учета регистра)
  3. Любые 4 цифры

Это то, что я до сих пор придумал: ^([a-zA-Z]([a-zA-Z]|-)[a-zA-Z])|[0-9]{4}$

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

Ответы [ 4 ]

2 голосов
/ 08 ноября 2019

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

^(?:[a-zA-Z][a-zA-Z-][a-zA-Z]|[0-9]{4})$

Демонстрация RegEx

Подробности RegEx:

  • ^: Начало
  • (?:: запуск группы без захвата, соответствующей любой из этих двух альтернатив
    • [a-zA-Z][a-zA-Z-][a-zA-Z]: совпадение 3 букв или letter-letter
    • |: ИЛИ
    • [0-9]{4}: совпадение 4 цифр
  • ): конец группы без захвата
  • $: конец
1 голос
/ 08 ноября 2019

Ваша первая альтернатива, которая соответствует буквам, имеет только якорь ^, поэтому она просто проверяет, что ввод начинается с 3 букв или 2 букв, разделенных дефисом.

Ваша вторая альтернатива имеет только $ якорь, поэтому он просто проверяет, что конец ввода состоит из 4 цифр.

Вам нужно поместить оба якоря в обе альтернативы.

^([a-zA-Z]([a-zA-Z]|-)[a-zA-Z])$|^[0-9]{4}$

или расположить другую группу вокруг всего, кроме якорей.

^(([a-zA-Z]([a-zA-Z]|-)[a-zA-Z])|[0-9]{4})$
1 голос
/ 08 ноября 2019

Вам нужно объединить свои чередования в группу, чтобы якоря применялись ко всем из них:

^(([a-zA-Z][a-zA-Z-][a-zA-Z])|[0-9]{4})$

Демонстрация по регулярному выражению regex101

Обратите внимание, что вы можетепросто включите - во второй класс символов в первом чередовании, поскольку [a-zA-Z-] эквивалентно ([a-zA-Z]|-).

0 голосов
/ 09 ноября 2019

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

Например, в синтаксисе JavaScript это будет

/\d{4}|[a-z]([a-z]|-)[a-z]/ig

  • \d - это сокращение от цифр [0-9]
  • i обозначает регистр без учета
  • g обозначает глобальный, который будет соответствовать всем вхождениям, а нетолько первый

См. пример на Regex101

const pattern = /\d{4}|[a-z]([a-z]|-)[a-z]/ig

const test = (desc, str) => {
  const match = (str.match(pattern) || []).join(', ')
  console.log(desc, '\n', str, '→', match, match ? '✓' : '×')
}

test('Any 3 letters (case-insensitive, no other characters except for alphabetic characters)', 'fourhundredandfive')
test('Any 2 letters with a dash in between (case-insensitive)', 'no-one')
test('Any 4 digits', 'ab 1234567 ab')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...