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() 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

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.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.