Je conçois un testeur d'expressions régulières en HTML et JavaScript. L'utilisateur entrera une expression rationnelle, une chaîne et choisira la fonction avec laquelle il veut tester (par exemple rechercher, faire correspondre, remplacer, etc.) via le bouton radio et le programme affichera les résultats lorsque cette fonction sera exécutée avec les arguments spécifiés. Naturellement, il y aura des zones de texte supplémentaires pour les arguments supplémentaires à remplacer et autres.
Mon problème est d'obtenir la chaîne de l'utilisateur et de la transformer en une expression régulière. Si je dis qu'ils n'ont pas besoin d'avoir //
autour de l'expression régulière dans laquelle ils entrent, ils ne peuvent pas définir de drapeaux, comme g
et i
. Ils doivent donc avoir le //
's autour de l'expression, mais comment puis-je convertir cette chaîne en expression régulière? Ce ne peut pas être un littéral car c'est une chaîne, et je ne peux pas le passer au constructeur RegExp car ce n'est pas une chaîne sans le //
. Existe-t-il un autre moyen de transformer une chaîne d'entrée utilisateur en expression régulière? Dois-je analyser la chaîne et les drapeaux de l'expression rationnelle avec le //
s, puis le construire d'une autre manière? Dois-je les faire entrer une chaîne, puis entrer les drapeaux séparément?
la source
var re = new RegExp("\\w+");
<input>
balise HTML.var re = new RegExp("\"\\w+\"");
est un exemple d'une expression rationnelle codée en dur utilisant le constructeur RegExp et l'échappement des guillemets doubles est nécessaire. Ce que je veux dire par une chaîne dans une variable, c'est que vous pouvez simplement le fairevar re = new RegExp(str);
etstr
peut contenir des guillemets doubles ou des barres obliques inversées sans problème.ou
la source
/\/
est reconnue.Voici un one-liner:
str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')
Je l'ai obtenu du module NPM escape-string-regexp .
L'essayer:
Utilisation de littéraux de modèle balisés avec prise en charge des indicateurs:
la source
Utilisez le constructeur d'objet JavaScript RegExp .
Vous pouvez passer des indicateurs comme deuxième argument de chaîne au constructeur. Consultez la documentation pour plus de détails.
la source
Dans mon cas, l'entrée utilisateur était parfois entourée de délimiteurs et parfois non. j'ai donc ajouté un autre cas ..
la source
.split()
fonction au lieu d'une longue chaîne d'expression régulière.regParts = inputstring.split('/')
cela feraitregParts[1]
la chaîne d'expression régulière etregParts[2]
les délimiteurs (en supposant que la configuration de l'expression régulière est/.../gim
). Vous pouvez vérifier s'il y a des délimiteurs avecregParts[2].length < 0
.Je vous suggère également d'ajouter des cases à cocher distinctes ou un champ de texte pour les drapeaux spéciaux. De cette façon, il est clair que l'utilisateur n'a pas besoin d'en ajouter
//
. Dans le cas d'un remplacement, fournissez deux champs de texte. Cela vous facilitera beaucoup la vie.Pourquoi? Parce que sinon, certains utilisateurs ajouteront des
//
'tandis que d'autres ne le feront pas. Et certains feront une erreur de syntaxe. Ensuite, après avoir supprimé le//
's', vous pouvez vous retrouver avec une expression rationnelle syntaxiquement valide qui ne ressemble en rien à ce que l'utilisateur avait l'intention, conduisant à un comportement étrange (du point de vue de l'utilisateur).la source
Cela fonctionnera également lorsque la chaîne n'est pas valide ou ne contient pas d'indicateurs, etc.:
la source
Si vous voulez vraiment convertir une chaîne en expression régulière, essayez d'utiliser la fonction suivante:
Vous pouvez l'utiliser comme ceci:
Pour référence, voici la version formatée et plus moderne:
la source
Grâce aux réponses précédentes, ce bloc sert bien de solution générale pour appliquer une chaîne configurable dans un RegEx .. pour filtrer le texte:
la source
Vous pouvez demander des indicateurs à l'aide de cases à cocher, puis faire quelque chose comme ceci:
la source
J'utilise
eval
pour résoudre ce problème.Par exemple:
la source