Utilizza una stringa dinamica (variabile) come pattern regex in JavaScript


101

Voglio aggiungere un tag (variabile) ai valori con regex, il pattern funziona bene con PHP ma ho problemi a implementarlo in JavaScript.

Il modello è ( valueè la variabile):

/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is

Sono sfuggito ai backslash:

var str = $("#div").html();
var regex = "/(?!(?:[^<]+>|[^>]+<\\/a>))\\b(" + value + ")\\b/is";
$("#div").html(str.replace(regex, "<a href='#" + value +">" + value + "</a>"));

Ma questo sembra non essere corretto, ho registrato lo schema ed è esattamente quello che dovrebbe essere. Qualche idea?


È valueuna variabile?
— Dogbert

Risposte:


173

Per creare la regex da una stringa, devi utilizzare l' RegExpoggetto JavaScript .

Se vuoi anche abbinare / sostituire più di una volta, devi aggiungere il gflag (corrispondenza globale) . Ecco un esempio:

var stringToGoIntoTheRegex = "abc";
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;

var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.

Demo di JSFiddle qui.


Nel caso generale, esegui l'escape della stringa prima di utilizzare come regex:

Tuttavia, non tutte le stringhe sono espressioni regolari valide: ci sono alcuni caratteri speciali, come (o [. Per aggirare questo problema, è sufficiente eseguire l'escape della stringa prima di trasformarla in un'espressione regolare. Una funzione di utilità per questo va nell'esempio seguente:

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

var stringToGoIntoTheRegex = escapeRegExp("abc"); // this is the only change from above
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;

var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.

Demo di JSFiddle qui.



Nota: la regex nella domanda utilizza il smodificatore, che non esisteva al momento della domanda, ma esiste - un flag / modificatore s( dotall ) in JavaScript - oggi .


2
questo è fantastico e il miglior esempio che ho trovato finora di utilizzare una variabile dinamica in una regex, grazie!
— Eolis

1
Per il 2019 c'è un s modificatore, vedere di nuovo il link MDN nella nota di risposta.
— Nickensoul

@Nickensoul Ben individuato! Grazie per il testa a testa!
— acdcjunior

let idr = new RegExp (variabile + "$"); Table.find ({field: new RegExp (idr, 'i')}) Mi è piaciuto questo. Saluti.
— Utkarsh

12

Se stai cercando di utilizzare un valore variabile nell'espressione, devi utilizzare il "costruttore" RegExp.

var regex="(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b";
new RegExp(regex, "is")

6

Non hai bisogno "di definire un'espressione regolare quindi basta:

var regex = /(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is; // this is valid syntax

Se valueè una variabile e desideri un'espressione regolare dinamica, non puoi utilizzare questa notazione; usa la notazione alternativa.

String.replace accetta anche stringhe come input, quindi puoi farlo "fox".replace("fox", "bear");

Alternativa:

var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(.*?)\b/", "is");

Tenete a mente che se valuecontiene caratteri normali espressioni come (, [e ?hai bisogno di sfuggire loro.


2
La prima opzione non funzionerebbe a meno che non si cerchi la stringa "value"
— mothmonsterman

@happytimeharry Sembra che ci sia un conflitto tra le due espressioni regolari che ha pubblicato.
— Halcyon

@Fritz van Campen sembra che l'intento del pattern, dato l'esempio dal suo javascript, fosse quello di utilizzare una variabile
— mothmonsterman

stesso problema qui, sembra che ci sia qualcosa di sbagliato con il flag "is": "Uncaught SyntaxError: flag non validi forniti al costruttore RegExp 'is'"
— Borstenhorst

i flag per il costruttore di RegExp devono essere separati. Ma ancora la regex non funziona.
— Borstenhorst

5

Ho trovato utile questo thread, quindi ho pensato di aggiungere la risposta al mio problema.

Volevo modificare un file di configurazione del database (datastax cassandra) da un'applicazione del nodo in javascript e per una delle impostazioni nel file avevo bisogno di trovare una corrispondenza su una stringa e quindi sostituire la riga che la segue.

Questa era la mia soluzione.

dse_cassandra_yaml='/etc/dse/cassandra/cassandra.yaml'

// a) find the searchString and grab all text on the following line to it
// b) replace all next line text with a newString supplied to function
// note - leaves searchString text untouched
function replaceStringNextLine(file, searchString, newString) {
fs.readFile(file, 'utf-8', function(err, data){
if (err) throw err;
    // need to use double escape '\\' when putting regex in strings !
    var re = "\\s+(\\-\\s(.*)?)(?:\\s|$)";
    var myRegExp = new RegExp(searchString + re, "g");
    var match = myRegExp.exec(data);
    var replaceThis = match[1];
    var writeString = data.replace(replaceThis, newString);
    fs.writeFile(file, writeString, 'utf-8', function (err) {
    if (err) throw err;
        console.log(file + ' updated');
    });
});
}

searchString = "data_file_directories:"
newString = "- /mnt/cassandra/data"

replaceStringNextLine(dse_cassandra_yaml, searchString, newString );

Dopo l'esecuzione, cambierà l'impostazione della directory dei dati esistente in quella nuova:

config prima:

data_file_directories:  
   - /var/lib/cassandra/data

config dopo:

data_file_directories:  
- /mnt/cassandra/data

4

Ho scoperto che dovevo tagliare due volte la \ b per farlo funzionare. Ad esempio, per rimuovere le parole "1x" da una stringa utilizzando una variabile, dovevo utilizzare:

    str = "1x";
    var regex = new RegExp("\\b"+str+"\\b","g"); // same as inv.replace(/\b1x\b/g, "")
    inv=inv.replace(regex, "");

Ha funzionato per me. Grazie,
— Pravin Bhapkar

1

Modo molto più semplice: usa letterali modello.

var variable = 'foo'
var expression = `.*${variable}.*`
var re = new RegExp(expression, 'g')
re.test('fdjklsffoodjkslfd') // true
re.test('fdjklsfdjkslfd') // false

0
var string = "Hi welcome to stack overflow"
var toSearch = "stack"

//case insensitive search

var result = string.search(new RegExp(toSearch, "i")) > 0 ? 'Matched' : 'notMatched'

https://jsfiddle.net/9f0mb6Lz/

Spero che questo ti aiuti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.