Víceřádkový režim v regulárních výrazech JavaScriptu

Dnes jsem se dozvěděl, že regulární výrazy JavaScriptu podporují multiline příznak (m ), a není to nic nového a zářivého... Funkce RegExp jsou podporovány roky!

MDN Compat Data (zdroj)
Informace o podpoře prohlížeče pro víceřádkový RegExp
1 1 12 1 1 1 1 1,5 1

Chcete-li zjistit, jak multiline regulární výrazy fungují, podívejme se na příklad, který obsahuje stříšku (^ ) kotva.

const winners = `1st place: Winnie
2nd place: Piglet
3rd place: Eeyore`;

// Match strings that:
//   - start with a digit (^\d)
//   - are followed by any sequence of characters (.+?)
//   - include a colon (:)
//   - and test for all possible matches (g)
winners.match(/^\d.+?:/g); 
// -> ["1st:"]

Regulární výraz /^\d.+?:/ odpovídá pouze 1st: . ^ označuje, že chcete najít shodu se vzorem na začátku řetězce. Začíná pouze jeden řetězec; takže zápas může být jen jeden. To je rozumné. 😉

Ale co když chcete odpovídat 1st: , 2nd: a 3rd: ?

Tato situace nastane, když multiline pomáhá.

const winners = `1st place: Jane
2nd place: Joe
3rd place: Stefan`;

// Match strings that:
//   - start lines with a digit (^\d)
//   - are followed by any sequence of characters (.+?)
//   - include a colon (:)
//   - consider multiple lines (m)
//   - and test for all possible matches (g) 
winners.match(/^\d.+?:/gm);
// -> ["1st:", "2nd:", "3rd:"]

m flag mění význam ^ od "začátek řetězce" po "začátek nového řádku". Toto chování lze také použít pro $ .

const winners = `1st place
2nd place
3rd place`;

// Match strings that:
//   - include a digit (\d)
//   - are followed by any sequence of characters (.+?)
//   - to the end of the string ($)
//   - and test for all possible matches (g)
winners.match(/\d.+?$/g);
// -> [ "3rd place" ]

// Match strings that:
//   - include a digit (\d)
//   - are followed by any sequence of characters (.+?)
//   - to the end of the line ($)
//   - and test for all possible matches (g) 
winners.match(/\d.+?$/gm); 
// -> [ "1st place", "2nd place", "3rd place" ]

A tady je poslední zábavný fakt:multiline také bere v úvahu \n (řádkový posuv), \r (carriage return) a další konce řádků, jako je \u2028 (oddělovač řádků) a \u2029 (oddělovač odstavce).

To je pěkná věc! Pokud se chcete dozvědět více, zde je stránka MDN pro multiline .