J'ai une très longue expression régulière, que je souhaite diviser en plusieurs lignes dans mon code JavaScript pour garder chaque ligne de 80 caractères selon les règles JSLint. C'est juste mieux pour lire, je pense. Voici un exemple de modèle:
var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
javascript
regex
jslint
expression
readability
Nik Sumeiko
la source
la source
/\S+@\S+\.\S+/
?Réponses:
Vous pouvez le convertir en chaîne et créer l'expression en appelant
new RegExp()
:Remarques:
RegExp
accepte les modificateurs comme deuxième paramètre/regex/g
=>new RegExp('regex', 'g')
[ Ajout ES20xx (modèle balisé)]
Dans ES20xx, vous pouvez utiliser des modèles balisés . Voir l'extrait.
Remarque:
\s
,\s+
,\s{1,x}
,\t
,\n
etc.).la source
new RegExp
est un excellent moyen pour les expressions régulières multilignes. Au lieu de joindre des tableaux, vous pouvez simplement utiliser un opérateur de concaténation de chaînes:var reg = new RegExp('^([a-' + 'z]+)$','i');
//
) et le coller comme argument de chaîne dans le constructeur RegExp. Cela est dû au fait que les caractères anti-slash sont consommés lors de l'évaluation du littéral de chaîne . Exemple:/Hey\sthere/
ne peut pas être remplacé parnew RegExp("Hey\sthere")
. Au lieu de cela, il doit être remplacé parnew RegExp("Hey\\sthere")
Notez la barre oblique inverse supplémentaire! Par conséquent, je préfère simplement laisser une longue expression régulière littérale sur une longue ligneRegExp
d'une manière qui est beaucoup plus facile à comprendre.En étendant la réponse @KooiInc, vous pouvez éviter d'échapper manuellement chaque caractère spécial en utilisant la
source
propriété de l'RegExp
objet.Exemple:
ou si vous voulez éviter de répéter la
.source
propriété, vous pouvez le faire en utilisant laArray.map()
fonction:Dans ES6, la fonction de carte peut être réduite à:
.map(r => r.source)
la source
combineRegex = (...regex) => new RegExp(regex.map(r => r.source).join(""))
Utilisation:combineRegex(/regex1/, /regex2/, ...)
Utilisation de chaînes dans
new RegExp
est gênante car vous devez échapper toutes les barres obliques inverses. Vous pouvez écrire des expressions régulières plus petites et les concaténer.Divisons cette expression régulière
Nous utiliserons une fonction pour rendre les choses plus belles plus tard
Et maintenant basculons
Comme cela a un coût, essayez de créer la vraie regex une seule fois, puis utilisez-la.
la source
multilineRegExp([/a|b/, /c|d])
résultats/a|bc|d/
, alors que vous vouliez dire(a|b)(c|d)
.Il y a de bonnes réponses ici, mais pour être complet, quelqu'un devrait mentionner la caractéristique principale de Javascript de l'héritage avec la chaîne de prototypes . Quelque chose comme ceci illustre l'idée:
la source
Grâce au monde merveilleux des modèles littéraux, vous pouvez désormais écrire de grandes expressions rationnelles multi-lignes, bien commentées et même imbriquées sémantiquement dans ES6.
En utilisant cela, vous pouvez maintenant écrire des expressions régulières comme ceci:
Les sorties
Ou qu'en est-il de la multiligne?
Sorties
hel
, soignées!"Et si j'ai besoin de rechercher une nouvelle ligne?", Eh bien, utilisez
\n
idiot!Travailler sur mon Firefox et Chrome.
Ok, "que diriez-vous de quelque chose d'un peu plus complexe?"
Bien sûr, voici un morceau d'un analyseur JS de destruction d'objet sur lequel je travaillais :
Il sort
/^\s*((\})|(?:[,{]\s*)(?:(\.\.\.)|(\b\d+\b|\b[A-Za-z$_][\w$]*\b|("|')(?:(?!\5|\\).|(?:\\.))*\5)\s*(:|)|\s*(?={)))((?:\s*(?:[,}\]=]|$)|\s*\}|\s*[{[:]|\s*[,}{]).*)$/
Et l'exécuter avec une petite démo?
Sorties avec succès
Notez la capture réussie de la chaîne entre guillemets.
Je l'ai testé sur Chrome et Firefox, ça marche un régal!
Si vous êtes curieux, vous pouvez consulter ce que je faisais et sa démonstration .
Bien que cela ne fonctionne que sur Chrome, car Firefox ne prend pas en charge les références arrière ou les groupes nommés. Notez donc que l'exemple donné dans cette réponse est en fait une version stérilisée et pourrait facilement être amené à accepter des chaînes invalides.
la source
Le regex ci-dessus manque des barres obliques noires qui ne fonctionnent pas correctement. Donc, j'ai édité le regex. Veuillez considérer cette expression régulière qui fonctionne à 99,99% pour la validation des e-mails.
la source
Pour éviter le tableau
join
, vous pouvez également utiliser la syntaxe suivante:la source
Personnellement, j'opterais pour une regex moins compliquée:
Bien sûr, c'est moins précis que votre modèle actuel, mais qu'essayez-vous d'accomplir? Essayez-vous de détecter les erreurs accidentelles que vos utilisateurs pourraient saisir ou craignez-vous que vos utilisateurs essaient de saisir des adresses non valides? Si c'est le premier, j'opterais pour un modèle plus simple. Si c'est le dernier cas, une vérification en répondant à un e-mail envoyé à cette adresse pourrait être une meilleure option.
Cependant, si vous souhaitez utiliser votre modèle actuel, il serait (IMO) plus facile à lire (et à maintenir!) En le construisant à partir de sous-modèles plus petits, comme ceci:
la source
Vous pouvez simplement utiliser une opération de chaîne.
la source
J'ai essayé d'améliorer la réponse de korun en encapsulant tout et en implémentant la prise en charge de la division des groupes de capture et des jeux de caractères - rendant cette méthode beaucoup plus polyvalente.
Pour utiliser cet extrait, vous devez appeler la fonction variadic
combineRegex
dont les arguments sont les objets d'expression régulière que vous devez combiner. Sa mise en œuvre se trouve en bas.Les groupes de capture ne peuvent pas être divisés directement de cette façon, car cela laisserait certaines parties avec une seule parenthèse. Votre navigateur échouerait avec une exception.
Au lieu de cela, je passe simplement le contenu du groupe de capture dans un tableau. Les parenthèses sont automatiquement ajoutées lorsque
combineRegex
rencontre d'un tableau.De plus, les quantificateurs doivent suivre quelque chose. Si, pour une raison quelconque, l'expression régulière doit être divisée devant un quantificateur, vous devez ajouter une paire de parenthèses. Ceux-ci seront supprimés automatiquement. Le fait est qu'un groupe de capture vide est assez inutile et que de cette façon les quantificateurs ont quelque chose à faire référence. La même méthode peut être utilisée pour des choses comme des groupes non capturants (
/(?:abc)/
devient[/()?:abc/]
).Ceci est mieux expliqué en utilisant un exemple simple:
deviendrait:
Si vous devez diviser les jeux de caractères, vous pouvez utiliser des objets (
{"":[regex1, regex2, ...]}
) au lieu de tableaux ([regex1, regex2, ...]
). Le contenu de la clé peut être n'importe quoi tant que l'objet ne contient qu'une seule clé. Notez qu'au lieu de cela,()
vous devez utiliser]
comme début fictif si le premier caractère peut être interprété comme un quantificateur. C'est à dire/[+?]/
devient{"":[/]+?/]}
Voici l'extrait de code et un exemple plus complet:
la source
La grande réponse de @ Hashbrown m'a mis sur la bonne voie. Voici ma version, également inspirée de ce blog .
Utilisez-le comme ceci:
Pour créer cet
RegExp
objet:la source