Проверьте, соответствует ли строка регулярному выражению в JS


753

Я хочу использовать JavaScript (может быть с jQuery), чтобы выполнить некоторую проверку на стороне клиента, чтобы проверить, соответствует ли строка регулярному выражению:

^([a-z0-9]{5,})$

В идеале это было бы выражение, которое возвращало истину или ложь.

Я новичок в JavaScript, match()делаю то, что мне нужно? Кажется, чтобы проверить, соответствует ли часть строки регулярному выражению, а не все.


Вы хотите полное совпадение или просто содержит ли строка соответствующую подстроку?
Керрек С.Б.

1
Полное совпадение - не совпадающая подстрока.
Ричард

Ответы:


1197

Используйте, regex.test()если все, что вы хотите, это логический результат:

console.log(/^([a-z0-9]{5,})$/.test('abc1')); // false

console.log(/^([a-z0-9]{5,})$/.test('abc12')); // true

console.log(/^([a-z0-9]{5,})$/.test('abc123')); // true

... и вы можете удалить ()из своего регулярного выражения, так как вам не нужно захватывать.


1
Что там делает начальное ^ в регулярном выражении?
PedroD

8
@PedroD ^ подразумевает начало или начинается с
Нагараджу

Так как бы вы поступили наоборот? "не начинается с ..."
PedroD


3
@stackdave, возможно, вы работаете с Java, а не с JavaScript?
сфарбота

177

Используйте test()метод:

var term = "sample1";
var re = new RegExp("^([a-z0-9]{5,})$");
if (re.test(term)) {
    console.log("Valid");
} else {
    console.log("Invalid");
}

3
Обратите внимание, что версия с RegExpпозволяет вводить значения переменных в строку регулярного выражения.
Кристоф Русси

2
пришлось убрать двойные кавычки new RegExp("^([a-z0-9]{5,})$"), чтобы заставить его работать
Факундо Коломбье

98

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

if (str.match(/^([a-z0-9]{5,})$/)) {
    alert("match!");
}

Но, test()кажется, быстрее, как вы можете прочитать здесь .

Важная разница между match()и test():

match()работает только со строками, но test()работает и с целыми числами.

12345.match(/^([a-z0-9]{5,})$/); // ERROR
/^([a-z0-9]{5,})$/.test(12345);  // true
/^([a-z0-9]{5,})$/.test(null);   // false

// Better watch out for undefined values
/^([a-z0-9]{5,})$/.test(undefined); // true

Причина, по которой он работает с числом, заключается в том, что число приводится в строку, потому что оно дается в качестве параметра, когда оно ожидает строку. Я бы не стал полагаться на это поведение. Это зависит от реализации test () в вашей среде. (совпадение не удается, потому что номера не имеют matchчлена). Я бы рекомендовал явно преобразовать ваш номер в строку, если вы хотите использовать его с регулярным выражением ( String(123)например).
Бронздрагон

Сопоставление можно использовать здесь, но если вы посмотрите на производительность, она testработает на 30% лучше, когда мы просто хотим проверить строку на соответствие регулярному выражению, а не извлекать из нее подстроки.
Аканш

@pmrotule Да, но это должно быть упомянуто перед описанием матча.
Аканш

Наиболее существенное различие между test и match (и matchAll) заключается в том, что match возвращает вещи со всеми соответствующими подстроками, в то время как test только проверяет, есть ли они. Проверьте методы регулярных выражений в javascript.info/regexp-methods
Хуан Ланус

50

Используйте, /youregexp/.test(yourString)если вы хотите знать, соответствует ли ваша строка регулярному выражению.


8

Вот пример, который ищет определенные теги HTML, поэтому ясно, что он /someregex/.test()возвращает логическое значение:

if(/(span|h[0-6]|li|a)/i.test("h3")) alert('true');

6
 let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 let regexp = /[a-d]/gi;
 console.log(str.match(regexp));

2

Вы можете попробовать это, это работает для меня.

 <input type="text"  onchange="CheckValidAmount(this.value)" name="amount" required>

 <script type="text/javascript">
    function CheckValidAmount(amount) {          
       var a = /^(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/;
       if(amount.match(a)){
           alert("matches");
       }else{
        alert("does not match"); 
       }
    }
</script>


1

пытаться

 /^[a-z\d]{5,}$/.test(str)


2
Какое новое значение дает этот ответ только для кода на страницу?
mickmackusa

В настоящее время это
самое

1
Бритье одного персонажа из шаблонов, опубликованных несколько лет назад. Йон.
mickmackusa

2
Просто оставьте комментарий под более ранним ответом, чтобы заявить, что 0-9можно уменьшить aaaaaaaaaaaaaaaaaaaaa, вплоть до \d. О, и что группа захвата не нужна.
mickmackusa

1

Я бы рекомендовал использовать метод execute, который возвращает null, если совпадений не существует, в противном случае он возвращает полезный объект.

let case1 = /^([a-z0-9]{5,})$/.exec("abc1");
console.log(case1); //null

let case2 = /^([a-z0-9]{5,})$/.exec("pass3434");
console.log(case2); // ['pass3434', 'pass3434', index:0, input:'pass3434', groups: undefined]

0
const regExpStr = "^([a-z0-9]{5,})$"
const result = new RegExp(regExpStr, 'g').test("Your string") // here I have used 'g' which means global search
console.log(result) // true if it matched, false if it doesn't
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.