Вопрос регулярного выражения, который включает разные буквы

Я пытаюсь выяснить Regex, который будет принимать только следующие строки.

  • 7 и 8 номера: «1234567» и «12345678»

  • Номера 7 и 8, начинающиеся с буквы T: «T234567» и «T2345678».

  • Номера 7 и 8, начинающиеся с буквы D: «D234567» и «D2345678».

  • Номера 7 и 8, начинающиеся с TD: «TD34567» и «TD345678».

Regex у меня есть:

/^(T|[0-9]){1}(D|[0-9]){1}([0-9]){5,6}$/

но он не проходит мой модульный тест для «D234567» и «D2345678»

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
2
0
39
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вы можете написать шаблон как:

^(?:\d{7,8}|[TD]\d{6,7}|TD\d{5,6})$

Объяснение

  • ^ Начало строки
  • (?: Группа без захвата для альтернатив
    • \d{7,8} Сопоставьте 7-8 цифр
    • | Или
    • [TD]\d{6,7} Сопоставьте либо T, либо D и 6-7 цифр.
    • | Или
    • TD\d{5,6} Сопоставьте TD и 5-6 цифры
  • ) Закройте группу без захвата
  • $ Конец строки

Демонстрация регулярных выражений.

...или очень легкий вариант ^(?:\d{2}|[TD]\d|TD)\d{5,6}$.

Cary Swoveland 23.04.2022 04:40

Я действительно понял это сразу после того, как опубликовал этот вопрос. Просто добавил |D после T| Ну вот так.

/^(T|D|[0-9]){1}(D|[0-9]){1}([0-9]){5,6}$/

Обратите внимание, что это также может соответствовать DD345678

The fourth bird 22.04.2022 22:20

Это верный момент. Я думаю, что я буду в порядке с началом DD

Henry 22.04.2022 22:46

Он также может соответствовать 1D345678, и в этом случае вы можете сократить шаблон до ^[TD0-9][D0-9][0-9]{5,6}$ Или в другом случае использовать ^(?:\d{7,8}|[TD]\d{6,7}|[TD]D\d{5,6})$regex101.com/r/CKipit/1

The fourth bird 22.04.2022 22:53
{1} не действует, поэтому его можно удалить. Например, (T|D|[0-9]){1} это то же самое, что (T|D|[0-9]). Кроме того, использование группы захвата здесь может сигнализировать читателю, что позже вы будете использовать захваченное значение, но вам лучше не использовать группу без захвата: (?:T|D|[0-9])
Cary Swoveland 23.04.2022 04:42
const r = /^(?=.{7,8}$)T?D?\d+$/

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

import {lookAhead, maybe, sequence, suffix} from "compose-regexp"

const r = sequence(
  // start anchor
  /^/,
  // are there exactly 7 or 8 characters before the end?
  lookAhead(suffix([7,8], /./), /$/),
  // optionally match a 'T'
  maybe('T'),
  // optionally match a 'D'
  maybe('D'),
  // match numbers until the end
  suffix('+', /\d/),
  /$/
)

Вы можете попробовать здесь

С тестами в изобилии.

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