Jak uzyskać dostęp do dopasowanych grup w wyrażeniu regularnym JavaScript?


1368

Chcę dopasować część ciągu za pomocą wyrażenia regularnego, a następnie uzyskać dostęp do podanego w nawiasie podłańcucha:

var myString = "something format_abc"; // I want "abc"

var arr = /(?:^|\s)format_(.*?)(?:\s|$)/.exec(myString);

console.log(arr);     // Prints: [" format_abc", "abc"] .. so far so good.
console.log(arr[1]);  // Prints: undefined  (???)
console.log(arr[0]);  // Prints: format_undefined (!!!)

Co ja robię źle?


Odkryłem, że nie było nic złego w powyższym kodzie wyrażeń regularnych: ciąg, który testowałem, był następujący:

"date format_%A"

Zgłaszanie, że „% A” jest niezdefiniowane, wydaje się bardzo dziwnym zachowaniem, ale nie jest bezpośrednio związane z tym pytaniem, więc otworzyłem nowe, Dlaczego dopasowane JavaScript zwraca „niezdefiniowane” w JavaScript? .


Problem polegał na tym, że console.logjego parametry były traktowane jak printfinstrukcja, a ponieważ ciąg, który logowałem ( "%A") miał specjalną wartość, próbował znaleźć wartość następnego parametru.

Odpowiedzi:


1673

Możesz uzyskać dostęp do takich grup przechwytywania:

var myString = "something format_abc";
var myRegexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;
var match = myRegexp.exec(myString);
console.log(match[1]); // abc

A jeśli jest wiele dopasowań, możesz je powtarzać:

var myString = "something format_abc";
var myRegexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;
match = myRegexp.exec(myString);
while (match != null) {
  // matched text: match[0]
  // match start: match.index
  // capturing group n: match[n]
  console.log(match[0])
  match = myRegexp.exec(myString);
}

Edycja: 10.09.2019

Jak widać sposób powtarzania wielu meczów nie był zbyt intuicyjny. Doprowadziło to do propozycji String.prototype.matchAllmetody. Oczekuje się, że ta nowa metoda będzie dostępna w specyfikacji ECMAScript 2020 . Daje nam czysty interfejs API i rozwiązuje wiele problemów. Rozpoczęło się na głównych przeglądarkach i silnikach JS jako Chrome 73+ / Node 12+ i Firefox 67+.

Metoda zwraca iterator i jest używana w następujący sposób:

const string = "something format_abc";
const regexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;
const matches = string.matchAll(regexp);
    
for (const match of matches) {
  console.log(match);
  console.log(match.index)
}

Gdy zwraca iterator, możemy powiedzieć, że jest leniwy, co jest użyteczne przy obsłudze szczególnie dużej liczby grup przechwytywania lub bardzo dużych ciągów. Ale jeśli potrzebujesz, wynik można łatwo przekształcić w tablicę za pomocą składni rozprzestrzeniania lub Array.frommetody:

function getFirstGroup(regexp, str) {
  const array = [...str.matchAll(regexp)];
  return array.map(m => m[1]);
}

// or:
function getFirstGroup(regexp, str) {
  return Array.from(str.matchAll(regexp), m => m[1]);
}

W międzyczasie, podczas gdy ta propozycja zyskuje szersze poparcie, możesz skorzystać z oficjalnego pakietu shim .

Również wewnętrzne funkcjonowanie metody jest proste. Równoważna implementacja korzystająca z funkcji generatora wyglądałaby następująco:

function* matchAll(str, regexp) {
  const flags = regexp.global ? regexp.flags : regexp.flags + "g";
  const re = new RegExp(regexp, flags);
  let match;
  while (match = re.exec(str)) {
    yield match;
  }
}

Zostanie utworzona kopia oryginalnego wyrażenia regularnego; ma to na celu uniknięcie skutków ubocznych spowodowanych mutacją lastIndexwłaściwości podczas przechodzenia przez wiele dopasowań.

Musimy również upewnić się, że wyrażenie regularne ma flagę globalną, aby uniknąć nieskończonej pętli.

Cieszę się również, że w dyskusji nad propozycją przywoływano nawet to pytanie StackOverflow .


114
+1 Pamiętaj, że w drugim przykładzie powinieneś użyć obiektu RegExp (nie tylko „/ myregexp /”), ponieważ zachowuje on wartość lastIndex w obiekcie. Bez użycia obiektu
— Regexp

7
@ianaz: Nie wierzę, że to prawda? http://jsfiddle.net/weEg9/ wydaje się działać przynajmniej w Chrome.
— spinningarrow

16
Dlaczego powyższe zamiast var match = myString.match(myRegexp); // alert(match[1]):?
— JohnAllen,

29
Nie ma potrzeby wyraźnego „nowego RegExp”, jednak pojawi się nieskończona pętla, chyba że podano / g
— George C

4
Innym sposobem, aby nie wpaść w nieskończoną pętlę, jest dokładne zaktualizowanie łańcucha, np.string = string.substring(match.index + match[0].length)
— Olga

186

Oto metoda, za pomocą której można uzyskać n- tą grupę przechwytywania dla każdego dopasowania:

function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}


// Example :
var myString = 'something format_abc something format_def something format_ghi';
var myRegEx = /(?:^|\s)format_(.*?)(?:\s|$)/g;

// Get an array containing the first capturing group for every match
var matches = getMatches(myString, myRegEx, 1);

// Log results
document.write(matches.length + ' matches found: ' + JSON.stringify(matches))
console.log(matches);


12
Jest to zdecydowanie lepsza odpowiedź od pozostałych, ponieważ poprawnie pokazuje iterację wszystkich dopasowań zamiast tylko jednego.
— Rob Evans

13
mnn ma rację. Spowoduje to wytworzenie nieskończonej pętli, jeśli flaga „g” nie będzie obecna. Bądź bardzo ostrożny z tą funkcją.
— Druska

4
Poprawiłem to, aby było podobne do re.findall () Pythona. Grupuje wszystkie dopasowania w tablicę tablic. Naprawiono także problem nieskończonej pętli globalnego modyfikatora. jsfiddle.net/ravishi/MbwpV
— ravishi

5
@MichaelMikowski właśnie ukryłeś swoją nieskończoną pętlę, ale twój kod będzie działał wolno. Twierdziłbym, że lepiej jest mieć złamanie kodu w zły sposób, abyś złapał go w fazie rozwoju. Nieprzestrzeganie tego, aby włamać się do maksymalnej iteracji bs, jest niedopuszczalne. Ukrywanie problemów zamiast ustalania ich pierwotnej przyczyny nie jest odpowiedzią.
— wallacer

4
@MichaelMikowski, który nie jest znacznie wolniejszy, gdy nie osiągasz limitu wykonania. Kiedy jesteś, jest to znacznie wolniejsze. Nie twierdzę, że twój kod nie działa, mówię, że w praktyce myślę, że spowoduje więcej szkody niż pożytku. Ludzie pracujący w środowisku deweloperskim zobaczą, że kod działa dobrze bez obciążenia, pomimo wykonania 10000 niepotrzebnych operacji na jakiejś części kodu. Następnie wypchną go do środowiska produkcyjnego i będą się zastanawiać, dlaczego ich aplikacja nie działa pod obciążeniem. Z mojego doświadczenia wynika, że ​​lepiej jest, jeśli coś psuje się w sposób oczywisty i wcześniej w cyklu rozwojowym.
— wallacer

58

var myString = "something format_abc";
var arr = myString.match(/\bformat_(.*?)\b/);
console.log(arr[0] + " " + arr[1]);

To \bnie jest dokładnie to samo. (Działa --format_foo/, ale nie działa format_a_b) Ale chciałem pokazać alternatywę dla twojego wyrażenia, co jest w porządku. Oczywiście matchpołączenie jest ważne.


2
Jest dokładnie odwrotnie. „\ b” ogranicza słowa. słowo = „\ w” = [a-zA-Z0-9_]. „format_a_b” to słowo.
— BF

1
@ BF Szczerze mówiąc, dodałem „nie działa format_a_b”, jak to miało miejsce 6 lat temu, i nie pamiętam, co miałem na myśli ... :-) Wydaje mi się, że oznaczało to, że „nie działa atylko na przechwytywanie ”, to znaczy. pierwsza część alfabetyczna po format_.
— PhiLho,

1
Chciałem powiedzieć, że \ b (- format_foo /} \ b nie zwraca „--format_foo /”, ponieważ „-” i „/” nie są znakami \ word. Ale \ b (format_a_b) \ b zwracają „format_a_b .?”Right odsyłam do wyciągu z tekstu w nawiasach okrągłych (Czy ma prawa głosu w dół!).
— BF

31

Jeśli chodzi o powyższe przykłady nawiasów wielokrotnych powyżej, szukałem tutaj odpowiedzi po tym, jak nie otrzymałem tego, czego chciałem:

var matches = mystring.match(/(?:neededToMatchButNotWantedInResult)(matchWanted)/igm);

Po spojrzeniu na nieco skomplikowane wywołania funkcji z while i .push () powyżej, przyszło mi do głowy, że problem można rozwiązać bardzo elegancko za pomocą mystring.replace () zamiast tego (zamiana NIE jest celem, a nawet nie jest zrobiona , CZYSTA, wbudowana opcja wywołania funkcji rekurencyjnej dla drugiego parametru to!):

var yourstring = 'something format_abc something format_def something format_ghi';

var matches = [];
yourstring.replace(/format_([^\s]+)/igm, function(m, p1){ matches.push(p1); } );

Po tym nie sądzę, żebym kiedykolwiek używał .match () do prawie niczego więcej.


26

Wreszcie znalazłem jeden wiersz kodu, który działał dla mnie dobrze (JS ES6):

let reg = /#([\S]+)/igm; // Get hashtags.
let string = 'mi alegría es total! ✌🙌\n#fiestasdefindeaño #PadreHijo #buenosmomentos #france #paris';

let matches = (string.match(reg) || []).map(e => e.replace(reg, '$1'));
console.log(matches);

Zwróci to:

['fiestasdefindeaño', 'PadreHijo', 'buenosmomentos', 'france', 'paris']

1
BUM! To najbardziej eleganckie rozwiązanie tutaj. Uważam, że jest to lepsze niż podejście Alexza, ponieważ ten jest mniej perspektywiczny i bardziej elegancki dla wielu wyników. Dobra robota, Sebastien H.replace
— Cody

Działa to tak dobrze, że zdecydowanie trafia w moje narzędzia :)
— Cody

1
@Cody haha ​​dzięki stary!
— Sebastien H.

19

Terminologia użyta w tej odpowiedzi:

  • Mecz wskazuje wynik prowadzenie wzór regex przeciw ciąg tak: someString.match(regexPattern).
  • Dopasowane wzorce wskazują wszystkie pasujące części ciągu wejściowego, które wszystkie znajdują się w tablicy dopasowania . Są to wszystkie wystąpienia wzorca w ciągu wejściowym.
  • Dopasowane grupy wskazują wszystkie grupy do złapania, zdefiniowane we wzorze RegEx. (Wzory w nawiasach, takie jak:, /format_(.*?)/ggdzie (.*?)byłaby dopasowana grupa.) Znajdują się one w dopasowanych wzorach .

Opis

Aby uzyskać dostęp do dopasowanych grup , w każdym dopasowanym wzorcu potrzebujesz funkcji lub czegoś podobnego do iteracji po dopasowaniu . Istnieje wiele sposobów, aby to zrobić, jak pokazuje wiele innych odpowiedzi. Większość innych odpowiedzi wykorzystuje pętlę while do iteracji wszystkich dopasowanych wzorców , ale myślę, że wszyscy znamy potencjalne niebezpieczeństwa związane z takim podejściem. Konieczne jest dopasowanie do new RegExp()samego wzorca, o którym wspomniano tylko w komentarzu. Wynika to z faktu, że .exec()metoda zachowuje się podobnie do funkcji generatora - zatrzymuje się za każdym razem, gdy występuje dopasowanie , ale .lastIndexkontynuuje ją od następnego .exec()wywołania.

Przykłady kodu

Poniżej znajduje się przykład funkcję searchString, która zwraca Arrayna wszystkich dopasowanych wzorców , gdzie każdy matchoznacza Arrayze wszystkie zawierającego grupy dopasowane . Zamiast używać pętli while, podałem przykłady, używając zarówno Array.prototype.map()funkcji, jak i bardziej wydajnego sposobu - używając zwykłej forpętli.

Zwięzłe wersje (mniej kodu, więcej cukru syntaktycznego)

Są one mniej wydajne, ponieważ w zasadzie implementują forEachpętlę zamiast szybszej forpętli.

// Concise ES6/ES2015 syntax
const searchString = 
    (string, pattern) => 
        string
        .match(new RegExp(pattern.source, pattern.flags))
        .map(match => 
            new RegExp(pattern.source, pattern.flags)
            .exec(match));

// Or if you will, with ES5 syntax
function searchString(string, pattern) {
    return string
        .match(new RegExp(pattern.source, pattern.flags))
        .map(match =>
            new RegExp(pattern.source, pattern.flags)
            .exec(match));
}

let string = "something format_abc",
    pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;

let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag

Wersje performanckie (więcej kodu, mniej cukru syntaktycznego)

// Performant ES6/ES2015 syntax
const searchString = (string, pattern) => {
    let result = [];

    const matches = string.match(new RegExp(pattern.source, pattern.flags));

    for (let i = 0; i < matches.length; i++) {
        result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
    }

    return result;
};

// Same thing, but with ES5 syntax
function searchString(string, pattern) {
    var result = [];

    var matches = string.match(new RegExp(pattern.source, pattern.flags));

    for (var i = 0; i < matches.length; i++) {
        result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
    }

    return result;
}

let string = "something format_abc",
    pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;

let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag

Muszę jeszcze porównać te alternatywy z poprzednio wymienionymi w innych odpowiedziach, ale wątpię, aby to podejście było mniej wydajne i mniej bezpieczne w przypadku awarii niż inne.


19

String#matchAll(patrz propozycja etapu 3/7 grudnia 2018 r. ), upraszcza dostęp do wszystkich grup w obiekcie dopasowania (pamiętaj, że grupa 0 to całe dopasowanie, podczas gdy kolejne grupy odpowiadają grupom przechwytywania we wzorcu):

Z matchAlldostępnych, można uniknąć whilepętli i execz /g... Zamiast tego, za pomocą matchAll, wrócisz iterator, który można wykorzystać w bardziej dogodnych for...of, rozpostartymi tablica lub Array.from()konstruktami

Ta metoda daje wynik podobny do Regex.MatchesC #, re.finditerw Pythonie, preg_match_allw PHP.

Zobacz wersję demonstracyjną JS (przetestowaną w Google Chrome 73.0.3683.67 (oficjalna wersja), beta (64-bit)):

var myString = "key1:value1, key2-value2!!@key3=value3";
var matches = myString.matchAll(/(\w+)[:=-](\w+)/g);
console.log([...matches]); // All match with capturing group values

te console.log([...matches])pokazy

wprowadź opis zdjęcia tutaj

Możesz również uzyskać wartość dopasowania lub określone wartości grupy za pomocą

let matchData = "key1:value1, key2-value2!!@key3=value3".matchAll(/(\w+)[:=-](\w+)/g)
var matches = [...matchData]; // Note matchAll result is not re-iterable

console.log(Array.from(matches, m => m[0])); // All match (Group 0) values
// => [ "key1:value1", "key2-value2", "key3=value3" ]
console.log(Array.from(matches, m => m[1])); // All match (Group 1) values
// => [ "key1", "key2", "key3" ]

UWAGA : Zobacz szczegóły zgodności przeglądarki .


Idealny przykład dla par kluczowych wartości. Zwięzły i łatwy do odczytania, bardzo prosty w użyciu. Ponadto, lepsza obsługa błędów, spread zwróci pustą tablicę zamiast wartości null, więc nie będzie więcej „błędów, żadnych właściwości„ długości ”wartości null”
— Jarrod McGuire

17

Twoja składnia prawdopodobnie nie jest najlepsza do zachowania. FF / Gecko definiuje RegExp jako rozszerzenie funkcji.
(FF2 poszedł tak daleko typeof(/pattern/) == 'function')

Wygląda na to, że jest to specyficzne dla FF - IE, Opery i Chrome - wszystkie zgłaszają wyjątki.

Zamiast tego użyj jednej z metod wcześniej wspomnianych przez innych: RegExp#execlub String#match.
Oferują te same wyniki:

var regex = /(?:^|\s)format_(.*?)(?:\s|$)/;
var input = "something format_abc";

regex(input);        //=> [" format_abc", "abc"]
regex.exec(input);   //=> [" format_abc", "abc"]
input.match(regex);  //=> [" format_abc", "abc"]

16

Nie ma potrzeby wywoływania execmetody! Możesz użyć metody „dopasuj” bezpośrednio na łańcuchu. Tylko nie zapomnij nawiasów.

var str = "This is cool";
var matches = str.match(/(This is)( cool)$/);
console.log( JSON.stringify(matches) ); // will print ["This is cool","This is"," cool"] or something like that...

Pozycja 0 ma ciąg ze wszystkimi wynikami. Pozycja 1 ma pierwsze dopasowanie w nawiasach, a pozycja 2 ma drugie dopasowanie w nawiasach. Zagnieżdżone nawiasy są trudne, więc uważaj!


4
Bez flagi globalnej zwraca wszystkie dopasowania, dzięki czemu otrzymasz tylko jedną dużą, więc uważaj na to.
— Shadymilkman01

8

Jedna wkładka, która jest praktyczna tylko wtedy, gdy masz jedną parę nawiasów:

while ( ( match = myRegex.exec( myStr ) ) && matches.push( match[1] ) ) {};

4
Dlaczego niewhile (match = myRegex.exec(myStr)) matches.push(match[1])
— willlma,

7

Za pomocą kodu:

console.log(arr[1]);  // prints: abc
console.log(arr[0]);  // prints:  format_abc

Edycja: Safari 3, jeśli ma to znaczenie.


7

Dzięki es2018 możesz teraz używać String.match()nazwanych grup, dzięki czemu wyrażenia regularne są bardziej wyraźne w stosunku do tego, co próbował zrobić.

const url =
  '/programming/432493/how-do-you-access-the-matched-groups-in-a-javascript-regular-expression?some=parameter';
const regex = /(?<protocol>https?):\/\/(?<hostname>[\w-\.]*)\/(?<pathname>[\w-\./]+)\??(?<querystring>.*?)?$/;
const { groups: segments } = url.match(regex);
console.log(segments);

i dostaniesz coś takiego

{protokół: „https”, nazwa hosta: „stackoverflow.com”, nazwa ścieżki: „pytania / 432493 / how-do-you-access-the-dopasowanych grup-w-wyrażeniu regularnym javascript”, kwerenda: „ some = parametr "}


6

function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}


// Example :
var myString = 'Rs.200 is Debited to A/c ...2031 on 02-12-14 20:05:49 (Clear Bal Rs.66248.77) AT ATM. TollFree 1800223344 18001024455 (6am-10pm)';
var myRegEx = /clear bal.+?(\d+\.?\d{2})/gi;

// Get an array containing the first capturing group for every match
var matches = getMatches(myString, myRegEx, 1);

// Log results
document.write(matches.length + ' matches found: ' + JSON.stringify(matches))
console.log(matches);

function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}


// Example :
var myString = 'something format_abc something format_def something format_ghi';
var myRegEx = /(?:^|\s)format_(.*?)(?:\s|$)/g;

// Get an array containing the first capturing group for every match
var matches = getMatches(myString, myRegEx, 1);

// Log results
document.write(matches.length + ' matches found: ' + JSON.stringify(matches))
console.log(matches);


3

Twój kod działa dla mnie (FF3 na Macu), nawet jeśli zgadzam się z PhiLo, że regex powinien być prawdopodobnie:

/\bformat_(.*?)\b/

(Ale oczywiście nie jestem pewien, ponieważ nie znam kontekstu wyrażenia regularnego.)


1
jest to lista rozdzielona spacjami, więc pomyślałem, że będzie dobrze. dziwne, że ten kod nie działał dla mnie (FF3 Vista)
— nick

1
Tak, naprawdę dziwne. Czy próbowałeś tego samodzielnie w konsoli Firebug? Mam na myśli z innej pustej strony.
— PEZ

2
/*Regex function for extracting object from "window.location.search" string.
 */

var search = "?a=3&b=4&c=7"; // Example search string

var getSearchObj = function (searchString) {

    var match, key, value, obj = {};
    var pattern = /(\w+)=(\w+)/g;
    var search = searchString.substr(1); // Remove '?'

    while (match = pattern.exec(search)) {
        obj[match[0].split('=')[0]] = match[0].split('=')[1];
    }

    return obj;

};

console.log(getSearchObj(search));

2

Tak naprawdę nie potrzebujesz jawnej pętli do analizowania wielu dopasowań - przekaż funkcję zastępczą jako drugi argument, jak opisano w String.prototype.replace(regex, func):

var str = "Our chief weapon is {1}, {0} and {2}!"; 
var params= ['surprise', 'fear', 'ruthless efficiency'];
var patt = /{([^}]+)}/g;

str=str.replace(patt, function(m0, m1, position){return params[parseInt(m1)];});

document.write(str);

m0Argumentem reprezentuje pełną dopasowany podciąg {0}, {1}itp m1reprezentuje pierwszą grupę dopasowanie, czyli część w nawiasach w regex, który jest 0w pierwszym meczu. I positionjest indeksem początkowym w ciągu, w którym znaleziono pasującą grupę - w tym przypadku nieużywany.


1

Możemy uzyskać dostęp do dopasowanej grupy w wyrażeniach regularnych, używając odwrotnego ukośnika, a następnie numeru pasującej grupy:

/([a-z])\1/

W kodzie \ 1 reprezentowanym przez pierwszą grupę ([az])


1

Rozwiązanie jednoliniowe:

const matches = (text,regex) => [...text.matchAll(regex)].map(([match])=>match)

Możesz więc użyć tej metody (musisz użyć / g):

matches("something format_abc", /(?:^|\s)format_(.*?)(?:\s|$)/g)

wynik:

[" format_abc"]

0

Uzyskaj wszystkie wystąpienia grupy

let m=[], s = "something format_abc  format_def  format_ghi";

s.replace(/(?:^|\s)format_(.*?)(?:\s|$)/g, (x,y)=> m.push(y));

console.log(m);


0

Jestem podobny do mnie i chciałbym, aby wyrażenie regularne zwróciło Obiekt taki:

{
    match: '...',
    matchAtIndex: 0,
    capturedGroups: [ '...', '...' ]
}

następnie wyciąć funkcję od dołu

/**
 * @param {string | number} input
 *          The input string to match
 * @param {regex | string}  expression
 *          Regular expression 
 * @param {string} flags
 *          Optional Flags
 * 
 * @returns {array}
 * [{
    match: '...',
    matchAtIndex: 0,
    capturedGroups: [ '...', '...' ]
  }]     
 */
function regexMatch(input, expression, flags = "g") {
  let regex = expression instanceof RegExp ? expression : new RegExp(expression, flags)
  let matches = input.matchAll(regex)
  matches = [...matches]
  return matches.map(item => {
    return {
      match: item[0],
      matchAtIndex: item.index,
      capturedGroups: item.length > 1 ? item.slice(1) : undefined
    }
  })
}

let input = "key1:value1, key2:value2 "
let regex = /(\w+):(\w+)/g

let matches = regexMatch(input, regex)

console.log(matches)


0

PO PROSTU UŻYJ RegExp. 1 $ ... $ n ta grupa np .:

1. Aby dopasować pierwszą grupę RegExp. 1 USD

  1. Aby dopasować 2 grupę RegExp. 2 USD

jeśli użyjesz 3 grup w wyrażeniach regularnych (uwaga użyj po string.match (regex))

RegExp. 1 USD RegExp. 2 USD RegExp. 3 USD

 var str = "The rain in ${india} stays safe"; 
  var res = str.match(/\${(.*?)\}/ig);
  //i used only one group in above example so RegExp.$1
console.log(RegExp.$1)

//easiest way is use RegExp.$1 1st group in regex and 2nd grounp like
 //RegExp.$2 if exist use after match

var regex=/\${(.*?)\}/ig;
var str = "The rain in ${SPAIN} stays ${mainly} in the plain"; 
  var res = str.match(regex);
for (const match of res) {
  var res = match.match(regex);
  console.log(match);
  console.log(RegExp.$1)
 
}

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.