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.