Funkcje dla wyrażeń regularnych

Metoda test()

Metoda 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

Metoda match()

Dla każdego stringa istnieje metoda 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"]

Metoda matchAll()

Metoda matchAll() to nowsza wersja metody match().

W odróżnieniu od metody 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]
*/

Metoda split()

Metoda 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"]

Metoda 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

Metoda ta zwraca tylko pierwsze wystąpienie szukanego ciągu. Jeżeli chcemy znaleźć wszystkie wystąpienia, powinniśmy skorzystać z metody matchAll

Metoda replace()

Obiekty typu string posiadają metodę 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 metody 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 replace do metody 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"

Metoda exec()

Metoda 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, metoda 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 metody 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

Wszelkie prawa zastrzeżone. Jeżeli chcesz używać jakiejś części tego kursu, skontaktuj się z autorem.
Aha - i ta strona korzysta z ciasteczek.

Menu