Come scappare correttamente i caratteri in regexp

Voglio fare una ricerca stringa all’interno di una stringa. Semplicemente dicendo MySTR.search(Needle) .

Il problema si verifica quando questa stringa di needle contiene caratteri regolari speciali come *, + e così via. Fallisce con invalid quantifier errore invalid quantifier .

Ho navigato nel web e ho scoperto che la stringa può essere sfuggita con \Q some string \E

Tuttavia, questo non sempre produce il comportamento desiderato. Per esempio:

 var sNeedle = '*Stars!*'; var sMySTR = 'The contents of this string have no importance'; sMySTR.search('\Q' + sNeedle + '\E'); 

Il risultato è -1. OK.

 var sNeedle = '**Stars!**'; var sMySTR = 'The contents of this string have no importance'; sMySTR.search('\Q' + sNeedle + '\E'); 

Il risultato è “quantificatore non valido”. Questo accade perché 2 o più caratteri speciali si “toccano” a vicenda, perché:

 var sNeedle = '*Dont touch me*Stars!*Dont touch me*'; var sMySTR = 'The contents of this string have no importance'; sMySTR.search('\Q' + sNeedle + '\E'); 

Funzionerà OK.

So che potrei creare una funzione escapeAllBadChars(sInStr) e aggiungere solo doppie barre prima di ogni ansible carattere regex speciale, ma mi chiedo se c’è un modo più semplice per farlo?

\Q...\E non funziona in JavaScript (almeno, non sfugge nulla …) come puoi vedere:

 var s = "*"; print(s.search(/\Q*\E/)); print(s.search(/\*/)); 

produce:

 -1 0 

come puoi vedere su Ideone .

I seguenti caratteri devono essere sfuggiti:

  • (
  • )
  • [
  • {
  • *
  • +
  • .
  • $
  • ^
  • \
  • |
  • ?

Quindi, qualcosa come questo avrebbe fatto:

 function quote(regex) { return regex.replace(/([()[{*+.$^\\|?])/g, '\\$1'); } 

No, ] e } non hanno bisogno di essere scappati: non hanno alcun significato speciale, solo le loro parti di contatore di apertura.

Si noti che quando si utilizza un’espressione regolare letterale, /.../ , è anche necessario sfuggire a / char. Tuttavia, / non è un carattere metage regex: quando lo si utilizza in un object RegExp , non ha bisogno di una fuga.

Sto solo immergendo i miei piedi in Javascript, ma c’è un motivo per cui hai bisogno di usare il motore regex? Che ne dite di

 var sNeedle = '*Stars!*'; var sMySTR = 'The contents of this string have no importance'; if ( sMySTR.indexOf(sNeedle) > -1 ) { //found it } 

Ho eseguito una rapida ricerca su Google per vedere cosa c’è là fuori e sembra che tu abbia alcune opzioni per sfuggire ai personaggi delle espressioni regolari. Secondo una pagina , puoi definire ed eseguire una funzione come la seguente per sfuggire ai personaggi problematici:

 RegExp.escape = function(text) { return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); } 

In alternativa, puoi provare e utilizzare una libreria separata come XRegExp , che già gestisce le sfumature che stai cercando di ri-risolvere.

Duplicazione di https://stackoverflow.com/a/6969486/151312

Questo è corretto come da MDN (vedi spiegazione nel post sopra):

 function escapeRegExp(str) { return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); }