Регулярное выражение для кредитной карты, требующее одинаковых повторяющихся символов

#javascript #regex

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

Вопрос:

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

 d{4}[s-]*d{4}[s-]*d{4}[s-]*d{4}
 

Например, приведенное выше регулярное выражение позволяет передавать приведенное ниже. Последнее является проблематичным, поскольку оно содержит ‘-‘ и ‘ ‘ и «. Как мне придумать регулярное выражение, которое требует, чтобы все символы (‘-‘ или ‘ ‘ или «) были последовательно одинаковыми? т. Е. разрешать только первые 3, но не последнее утверждение.

1234123412341234, 1234-1234-1234-1234, 1234 1234 1234 1234, 1234-12341234 1234

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

1. Вы уверены, что имеете в виду [s-]* разрешение » -» или «-«. Может быть , ты хочешь [s-]? .

2.Если вы не хотите сопоставлять новую строку и один пробел, табуляцию или дефис bd{4}([ t-]?)d{4}1d{4}1d{4}b regex101.com/r/sIv8AM/1

Ответ №1:

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

Окончательное регулярное выражение: d{4}([s-])*d{4}1*d{4}1*d{4}

() Вокруг первой [s-] запускается группа захвата; более 1 позднее указывает на использование того же значения, которое было записано ранее.

Посмотрите это в действии здесь https://regexr.com/5l74g

Редактировать: согласно комментариям, лучшим решением может быть d{4}([s-]?)d{4}1d{4}1d{4} , в зависимости от того, каковы именно ваши требования. Это гарантирует, что - s и s не смешиваются, а также что есть только разделители 0 или 1.

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

1. 1 * не совсем правильно, таким образом, 1234 12341234 1234 проскальзывает

2. Достаточно справедливо! В зависимости от точного поведения, которое вам нужно, d{4}([s-]*)d{4}1d{4}1d{4} может быть более подходящим ( * внутри группы)

3. На это я хотел ответить, но вы были быстрее 🙂

4. @Alex Большое спасибо! Пытался найти этот ответ. Я думаю, что d{4}([s -]*) d{4} 1 d {4} 1 d {4} — лучший ответ для кредитных карт, если я могу добавить, было бы более полным изменить * внутри grp на ? , поскольку первое вызывает разрешение 1234—1234—1234—1234. Приветствия 🙂