Перевірте, чи збігається рядок з регулярним виразом у JS


750

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

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

В ідеалі це був би вираз, який повернув справжнє чи хибне.

Я новачок у JavaScript, чи match()роблю те, що мені потрібно? Здається, перевіряє, чи відповідає частина рядка регулярним виразом, а не вся справа.


Ви хочете завершити збіг, чи просто рядок містить відповідну підрядку?
Керрек СБ

1
Повна відповідність - не збіжна підрядка.
Річард

Відповіді:


1194

Використовуйте, 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
Що там робить початковий ^ в регулярному виразі?
ПедроД

8
@PedroD ^ означає, що починається або починається з
Нагараджу

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


3
@stackdave Ви, можливо, працюєте з Java, а не з JavaScript?
sfarbota

176

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

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

Тут можна використати відповідність, але якщо ви подивитеся на продуктивність, вона на test30% краще, коли ми просто хочемо перевірити рядок, щоб відповідати регулярному вираженню, а не витягувати з нього підрядки.
Аканш,

@pmrotule Так, але це слід згадати перед описом матчу.
Аканш

Найбільш суттєвою різницею між тестом та матчем (і matchAll) є те, що відповідність робить такі речі, як повернення списку всіх відповідних підрядків, тоді як тест перевіряє, чи є такі. Перевірте методи регексу в javascript.info/regexp-methods
Juan Lanus

50

Використовуйте, /youregexp/.test(yourString)якщо ви хочете дізнатись, чи відповідає ваша рядок regexp.


8

Ось приклад, який шукає певні теги HTML, щоб було зрозуміло, що /someregex/.test()повертає булевий:

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


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
Гоління 1 персонажа з візерунків, розміщених років тому. Позіхання.
mickmackusa

2
Просто залиште коментар під попередньою відповіддю, щоб стверджувати, що 0-9можна зменшити aaaaaaaaaaaaaaaaaaaaaall до шляху до \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.