Corrispondenza ricorsiva con espressioni regolari in Javascript

Esempio di stringa: $${a},{s$${d}$$}$$

Vorrei prima abbinare $${d}$$ e sostituirlo con un testo in modo che la stringa diventasse $${a},{sd}$$ , quindi $${a},{sd}$$ sarà abbinato.

Fastidiosamente, Javascript non fornisce il parametro ricorsivo PCRE (?R) , quindi è tutt’altro che facile da gestire con il problema annidato. Può essere fatto comunque.

Non riprodurrò il codice, ma se controlli il blog di Steve Levithan , ha alcuni buoni articoli sull’argomento. Dovrebbe farlo, è probabilmente l’autorità principale su RegExp in JS. Ha scritto XRegExp , che sostituisce la maggior parte dei bit PCRE che mancano, c’è anche un plugin Match ricorsivo !

Dal momento che si desidera eseguire questa operazione in modo ricorsivo, probabilmente si sta meglio effettuando più corrispondenze utilizzando un ciclo.

Regex in sé non è adatto per ricorsivi, qualsiasi cosa.

In generale, i regexps non sono adatti per questo tipo di problema. È meglio usare la macchina a stati.

 var content = "your string content"; var found = true; while (found) { found = false; content = content.replace(/regex/, () => { found = true; return "new value"; }); } 

L’ho scritto io stesso:

 String.prototype.replacerec = function (pattern, what) { var newstr = this.replace(pattern, what); if (newstr == this) return newstr; return newstr.replace(pattern, what); }; 

Uso:

 "My text".replacerec(/pattern/g,"what"); 

PS: Come suggerito da @lededje, quando si usa questa funzione in produzione è bene avere un contatore limitatore per evitare l’overflow dello stack.