Funkcje dla wyrażeń regularnych
Funkcja test()
Funkcja test() zwraca prawdę lub fałsz w zależności, czy wyrażenie regularne znalazło pasujący fragment.
const reg = /cat/;
console.log( reg.test("cat dog") ) //true
const reg2 = new RegExp("^cat$");
alert(reg2.test("cat dog")); //false
const text = "Turlal goryl...";
const reg = /[0-9]+/;
console.log(reg.test(text)) //false
Funkcja match()
Dla każdego string istnieje funkcja match(), która wyszukuje i zwraca pasujący fragment lub fragmenty jeżeli użyliśmy flagi g
:
const text = "Numer1, Numer2, Numer3, NumerB, Numer5, NumerD";
const reg1 = /Numer[1-4A-C]/;
console.log(text.match(reg1)); //[Numer1]
const reg2 = /Numer[1-4A-C]/g;
console.log(text.match(reg2)); //[Numer1, Numer2, Numer3, NumerB]
const reg = /\b\w+\b/g;
const result = "Ala ma kota a kot ma Ale".match(reg);
console.log(result); //["Ala", "ma", "kota", "a", "kot", "ma", "Ale"]
Funkcja matchAll()
Funkcja matchAll() to nowsza wersja funkcji match()
.
W odróżnieniu od funkcji match()
zwraca iterowalny obiekt składający się z tablic zawierających znalezione grupy. Jeżeli nic nie znajdzie, zwracany jest null:
const str = '<h1>Hello, world!</h1>';
const reg = /<(.*?)>/g;
const matchAll = str.matchAll(reg);
console.log(matchAll); // [object RegExp String Iterator]
const arr = [...matchAll];
let firstMatch = arr[0];
console.log( firstMatch[0] ); // <h1>
console.log( firstMatch[1] ); // h1
console.log( firstMatch.index ); // 0
console.log( firstMatch.input ); // <h1>Hello, world!</h1>
const txt = "2020-10-05";
const matchAll = txt.matchAll(/\d+/g);
for (let el of matchAll) {
console.log(el);
}
/*
["2020", index: 0, input: "2020-10-05", groups: undefined]
["10", index: 5, input: "2020-10-05", groups: undefined]
["05", index: 8, input: "2020-10-05", groups: undefined]
*/
Funkcja split()
Funkcja split() obiektu string służy do podziału tekstu na części. Znakiem podziału może być dowolny tekst, ale i wyrażenie regularne:
const txt = "Ala_ma_kota";
console.log(txt.split("_")); ["Ala", "ma", "kota"];
const txt = "Czołg o numerze 102 rusza do akcji i strzela 10 razy";
console.log(txt.split(/[0-9]+/)) //["Czołg o numerze ", " rusza do akcji i strzela ", " razy"]
Funkcja search()
Funkcja search() dla regexpów zwraca indeks pierwszego wystąpienia podciągu w przeszukiwanym tekście:
const text1 = "Fantomas robi masę";
const reg = /.asę/;
console.log("Search: " + text1.search(reg)); //14
Funkcja ta zwraca tylko pierwsze wystąpienie szukanego ciągu. Jeżeli chcemy znaleźć wszystkie wystąpienia, powinniśmy skorzystać z funkcji matchAll
Funkcja replace()
Obiekty typu string posiadają funkcję replace(), która służy do zamiany jednego ciągu na drugi.
const text = "ala ala ala";
console.log(text.replace("ala", "ola"); //"ola ala ala"
Przy jej stosowaniu także możemy używać wyrażeń regularnych:
const text = "Kolorowy kolor nie jest kolorowy?";
const reg = /lor/g
console.log(text.replace(reg, "ral")); //"Koralowy koral nie jest koralowy?"
Gdy w wyrażeniu regularnym zastosujemy grupy, w ciągu na który zamieniamy możemy skorzystać z dodatkowych zapisów:
$& | wstawia cały pasujący fragment |
$` | wstawia fragment występujący przed pasującym fragmentem |
$' | wstawia fragment występujący po pasującym fragmencie |
$n | wstawia fragment z grupy o danym numerze np. $1 |
$<name> | wstawia fragment z grupy o danej nazwie |
$$ | wstawia znak dolara |
const reg = /([0-9]{4})-([0-9]{2})-([0-9]{2})/
const text = "2020-10-05";
console.log( text.replace(reg, "Mamy rok $3 miesiąc $2 dzień $1") ); //"Mamy rok 2020 miesiąc 10 dzień 05"
Jako drugi argument tej funkcji możemy podać też funkcję, która przyjmuje kilka parametrów:
match | pasujący fragment tekstu (to samo co w powyższej tabeli $& ) |
p1, p2, p3, ...pn | kolejne pasujące fragmenty należące do zastosowanych w wyrażeniu grup |
offset | offset pasującego fragmentu tekstu. Przykładowo jeżeli badany tekst to abcd , a pasujący fragment to bc , to offset będzie wynosił 1 |
string | tekst który był badany |
groups | Jeżeli dana przeglądarka wspiera wyłapywanie grup z nazwami, parametr ten będzie zawierał obiekt którego kluczami będą nazwy grup, a wartościami pasujące fragmenty |
const text = "Super Samson jest fajny.";
const reg = /fajny/;
const textEnhanced = text.replace(reg, match => {
return "super" + match;
});
console.log(textEnhanced); //Super Samson jest super fajny
function replacer(match, p1, p2, offset, string) {
const name = p1[0].toUpperCase() + p1.substr(1);
const surname = p2[0].toUpperCase() + p2.substr(1);
return name + " " + surname;
}
console.log( 'karol nowak'.replace(/(\b\D+\b) (\b\D+\b)/, replacer) ) //Karol Nowak
console.log( 'beata pawlak'.replace(/(\b\D+\b) (\b\D+\b)/, replacer) ) //Beata Pawlak
W Ecmascript 2021 wprowadzono też funkcję replaceAll(), która działa całkiem podobnie, natomiast domyślnie zamienia wszystkie znalezione wystąpienia.
const text = "Kot jest rudy, kot jest zły. Kot podrapie cię do krwi.";
console.log(text.replace(/kot/i, "pies")); //"pies jest rudy, kot jest zły. Kot podrapie cię do krwi."
console.log(text.replaceAll(/kot/gi, "pies")); //"pies jest rudy, pies jest zły. pies podrapie cię do krwi."
//podobnie do funkcji replace(), także do replaceAll() możemy też przekazać zwykły tekst
console.log("kora kora kora".replace("kora", "pora"); //"pora kora kora"
console.log("kora kora kora".replaceAll("kora", "pora"); //"pora pora pora"
Funkcja exec()
Funkcja exec() działa nieco inaczej w zależności od tego, czy użyte wraz z nią wyrażenie regularne ma flagę g
czy jej nie ma.
Jeżeli wyrażenie nie ma flagi g
, funkcja exec() zwróci po prostu pasujący fragment.
const txt = "2020-10-20";
const reg = /\d+/
console.log(reg.exec(txt)); //"2020"
console.log(reg.exec(txt)); //"2020"
Jeżeli jednak użyjemy flagi g
, pierwsze odpalenie exec() zwróci pierwszy pasujący fragment, a dodatkowo pozycja zostanie zapisana w zmiennej regexp.lastIndex
. Każde kolejne odpalenie tej funkcji dla tego wyrażenia będzie zwracało kolejne fragmenty rozpoczynając od aktualizowanej właściwości regexp.lastIndex
const txt = "2020-10-20";
const reg = /\d+/g
console.log(reg.exec(txt)); //"2020"
console.log(reg.lastIndex); //4
console.log(reg.exec(txt)); //"10"
console.log(reg.lastIndex); //7
console.log(reg.exec(txt)); //"20"
console.log(reg.lastIndex); //10