2016-04-12 6 views
1

У меня есть следующее регулярное выражение:Javascript регулярного выражения советы

/^[0-9]{8}([a-z]{1})?|[0-9]{3}-[0-9]{2}-[0-9]{3}([a-z]{1})?/ 

Я пытаюсь соответствовать следующим шаблонам 12345678, 12345678a (любой 1 символ), 123-45-678, 123-45-678a (любой 1 символ).
Проблема в том, что я вхожу в 123456789, ее все еще действует из-за первого условия [0-9] {8}. Я искал, могу ли я использовать какой-то оператор И, но ничего не нашел. Есть ли способ добавить к моему регулярному выражению для каждого условия, чтобы он также соответствовал длине. Пример [0-9] {8} должен также совпадать с точной длиной? Итак, 12345678 верен, но 123456789 терпит неудачу?

Update 1

Вы, ребята дали мне большие примеры. Это определенно уменьшило мое выражение. Единственная проблема, которую я до сих пор сталкиваюсь является следующим кодом JavaScript:

var regExp = new RegExp(/^\d{3}-?\d{2}-?\d{3}[a-z]?/g); 
var isValid = regExp.test('12345678'); 
isValid is true 

var isValid = regExp.test('12345678d'); 
is valid 

the problem is if I enter 
var isValid = regExp.test('12345678dd'); 
is also valid because of 12345678d 

Since test() is used to find a match. Is there a way to test the exact phrase of the regular expression so that 12345678dd fails? 

Update 2 Хорошо, я полностью пропустил окончание $ в всяком например. Мое плохое спасибо за помощь

+0

почему не '{0-8}'? – reporter

+4

Используйте [якоря] (http://www.regular-expressions.info/anchors.html), также '{1}' никогда не требуется –

+0

Когда я добавляю {0-8} в [0-9] {0-8}, который, как я думаю, ссылаюсь на то, что я не получаю соответствие для 12345678. Я делаю мой тест на http://www.regexpal.com/, поэтому, когда я копирую выражение, он не копирует/^ – adviner

ответ

2

Один из способов фиксации вашего регулярного выражения:

/^\d{3}(-?)\d{2}\1\d{3}[a-z]?$/ 

Объяснение:
^ = начало строки
\d = любой 1 цифра от 0 до 9 , то же, что и [0-9]
{3} = ровно 3 вхождения p revious вещь, в данном случае это \d
-? = необязательный -
(<part-of-regex-here>) = захватывает матч, который пронумерован, начиная с 1, он может быть передан в регулярном выражении, как \1
[a-z] = любой нижний регистр алфавита
$ = конец строки

Demo on RegexPal.com

в ответ на изменение 1:

Если вы попробуете мое регулярное выражение:

var regExp = new RegExp(/^\d{3}-?\d{2}-?\d{3}[a-z]?$/); 
 
var isValid = regExp.test('12345678'); 
 
console.log(isValid); 
 

 
isValid = regExp.test('12345678d'); 
 
console.log(isValid); 
 

 
isValid = regExp.test('12345678dd'); 
 
console.log(isValid);

+1

Предложение по улучшению: '/^\ d {3} (-?) \ D {2} \ 1 \ d {3} [az]? $/G' - требуется либо тире или и то, и другое, а не только одно. –

+0

@NiettheDarkAbsol Спасибо! Это улучшает регулярное выражение! Я обновил свой ответ. –

1

Вы можете использовать /^(?:\d{8}|\d{3}-\d{2}-\d{3})[a-z]?$/, обратите внимание на якоря для начала (^) и конца ($) строки.

Я также использовал \d вместо [0-9], потому что он короче и imho более читабельн и положил [a-z]? вне чередования. Никогда не нужно использовать {1}.

Вот демо на Regex101

Смежные вопросы