Sprawdź, czy ciąg pasuje do wyrażenia regularnego w JS

750

Chcę użyć JavaScript (może być z jQuery), aby przeprowadzić weryfikację po stronie klienta, aby sprawdzić, czy łańcuch pasuje do wyrażenia regularnego:

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

Idealnie byłoby wyrażenie, które zwróciło prawda lub fałsz.

Jestem początkującym w JavaScript, czy match()robi to, czego potrzebuję? Wygląda na to, aby sprawdzić, czy część ciągu pasuje do wyrażenia regularnego, a nie całość.

Richard
źródło
Czy chcesz mieć pełne dopasowanie, czy tylko ciąg zawiera pasujący podciąg?
Kerrek SB
1
Pełne dopasowanie - niepasujący podciąg.
Richard

Odpowiedzi:

1194

Użyj, regex.test()jeśli wszystko, czego chcesz, to wynik boolowski:

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

... i możesz usunąć ()wyrażenie regularne, ponieważ nie potrzebujesz przechwytywania.

użytkownik113716
źródło
1
Co tam robi inicjał ^ w wyrażeniu regularnym?
PedroD,
8
@PedroD ^ oznacza rozpoczęcie lub rozpoczęcie od
Nagaraju,
Jak więc zrobiłbyś coś przeciwnego? „nie zaczyna się od ...”
PedroD,
3
@stackdave, być może pracujesz z Javą, a nie JavaScript?
sfarbota
176

Użyj test()metody:

var term = "sample1";
var re = new RegExp("^([a-z0-9]{5,})$");
if (re.test(term)) {
    console.log("Valid");
} else {
    console.log("Invalid");
}
Abhijeet Kasurde
źródło
3
Zauważ, że wersja z RegExppozwala wstrzykiwać zmienne wartości do łańcucha wyrażeń regularnych.
Christophe Roussy
2
musiał usunąć podwójne cudzysłowy new RegExp("^([a-z0-9]{5,})$"), aby zadziałało
Facundo Colombier
98

Możesz również użyć match():

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

Ale test()wydaje się być szybszy, jak możesz przeczytać tutaj .

Ważna różnica między match()i test():

match()działa tylko z łańcuchami, ale test()działa również z liczbami całkowitymi.

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
pmrotule
źródło
Powodem, dla którego działa z liczbą jest to, że liczba jest wymuszana na ciąg, ponieważ jest podawana jako parametr, gdy oczekuje łańcucha. Nie polegałbym na tym zachowaniu. To zależy od implementacji test () w twoim środowisku. (dopasowanie nie powiedzie się, ponieważ liczby nie mają matchczłonka). Polecam jawnie przekonwertować swój numer na ciąg, jeśli chcesz go użyć z wyrażeniem regularnym ( String(123)na przykład).
Bronzdragon,
Dopasowania można użyć tutaj, ale jeśli spojrzysz na wydajność, testdziała on o 30% lepiej, gdy chcemy tylko zweryfikować ciąg znaków, aby pasował do wyrażenia regularnego, a nie wyodrębniać z niego podciągów.
Akansh
@pmrotule Tak, ale należy o tym wspomnieć przed opisem meczu.
Akansh
Najistotniejsza różnica między testem a dopasowaniem (i matchAll) polega na tym, że dopasowanie przypomina zwracanie listy wszystkich pasujących podciągów, podczas gdy test sprawdza tylko, czy takie istnieją. Sprawdź metody wyrażenia regularnego w javascript.info/regexp-methods
Juan Lanus
50

Użyj, /youregexp/.test(yourString)jeśli chcesz tylko wiedzieć, czy łańcuch pasuje do wyrażenia regularnego.

użytkownik278064
źródło
8

Oto przykład, który wyszukuje pewne tagi HTML, więc jest jasne, że /someregex/.test()zwraca wartość logiczną:

if(/(span|h[0-6]|li|a)/i.test("h3")) alert('true');
użytkownik2449231
źródło
6
 let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 let regexp = /[a-d]/gi;
 console.log(str.match(regexp));
Eysun
źródło
2

Możesz spróbować tego, działa dla mnie.

 <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>
Tongi
źródło
1

spróbuj tego kwiatu:

/^[a-z0-9\_\.\-]{2,20}\@[a-z0-9\_\-]{2,20}\.[a-z]{2,9}$/.test('[email protected]');

prawdziwe

Jaber Alshami
źródło
1

próbować

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

Kamil Kiełczewski
źródło
2
Jaką nową wartość przynosi ta strona tylko odpowiedź na kod?
mickmackusa
obecnie jest to najkrótsze rozwiązanie (ze względu na uproszczenie wyrażeń regularnych)
Kamil Kiełczewski
1
Golenie 1 postaci ze wzorów opublikowanych lata temu. Ziewać.
mickmackusa
2
Po prostu zostaw komentarz pod wcześniejszą odpowiedzią, aby stwierdzić, że 0-9można zmniejszyć aaaaaaaaaaaaaaaaaaaaaall \d. Och, i że grupa przechwytująca nie jest konieczna.
mickmackusa
1

Polecam użycie metody execute, która zwraca null, jeśli nie istnieje dopasowanie, w przeciwnym razie zwraca pomocny obiekt.

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]
Juan Navarrete
źródło
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
Geetanshu Gulati
źródło