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ść.


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.


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");
}

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

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.


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');

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

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>

1

spróbuj tego kwiatu:

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

prawdziwe


1

próbować

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


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]

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.