web-dev-qa-db-fra.com

Utiliser une chaîne dynamique (variable) comme motif d'expression rationnelle en JavaScript

Je veux ajouter une balise (variable) aux valeurs avec regex, le modèle fonctionne bien avec PHP mais j'ai des problèmes pour l'implémenter en JavaScript.

Le modèle est (value est la variable):

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

J'ai échappé aux barres obliques inverses:

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

Mais cela ne semble pas être correct, j’ai enregistré le modèle et c’est exactement ce qu’il devrait être. Des idées?

63
Borstenhorst

Pour créer l'expression rationnelle à partir d'une chaîne, vous devez utiliser l'objet RegExp de JavaScript .

Si vous souhaitez également faire correspondre/remplacer plusieurs fois, n'oubliez pas d'ajouter l'indicateur g (correspondance globale) . Voici un exemple:

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.

démonstration de JSFiddle ici.


Dans le cas général, échappez la chaîne avant d’utiliser regex:

Cependant, toutes les chaînes ne sont pas des expressions rationnelles valides: il existe des caractères spécifiques, comme ( ou [. Pour contourner ce problème, échappez simplement la chaîne avant de la transformer en expression rationnelle. Une fonction utilitaire pour cela va dans l'exemple ci-dessous:

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.

démonstration de JSFiddle ici.



Remarque: l’expression rationnelle de la question utilise le modificateur s, qui n’existait pas au moment de la question, mais existe bel et bien - a s ( dotall) indicateur/modificateur en JavaScript - aujourd'hui .

121
acdcjunior

Si vous essayez d'utiliser une valeur de variable dans l'expression, vous devez utiliser le "constructeur" RegExp.

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

J'ai trouvé ce fil utile - j'ai donc pensé ajouter la réponse à mon propre problème.

Je souhaitais éditer un fichier de configuration de base de données (datastax cassandra) à partir d'une application de nœud en javascript et pour l'un des paramètres du fichier que je devais faire correspondre à une chaîne, puis remplacer la ligne qui le suivait.

C'était ma solution.

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 );

Après exécution, le paramètre de répertoire de données existant sera remplacé par le nouveau:

fichier de configuration avant:

data_file_directories:  
   - /var/lib/cassandra/data

fichier de configuration après:

data_file_directories:  
- /mnt/cassandra/data
4
JRD

Vous n'avez pas besoin du " Pour définir une expression régulière, alors:

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

Si value est une variable et que vous souhaitez une expression régulière dynamique, vous ne pouvez pas utiliser cette notation. utilisez la notation alternative.

String.replace Accepte également les chaînes en tant qu'entrée, vous pouvez donc faire "fox".replace("fox", "bear");

Alternative:

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");

N'oubliez pas que si value contient des caractères d'expressions régulières tels que (, [ Et ?, Vous devrez les échapper.

3
Halcyon
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/

J'espère que cela t'aides

0
Vinu