D'après mes recherches, il semblerait que les expressions régulières de Javascript n'aient aucun équivalent au modificateur Perl/x ou au modificateur RegexOptions.IgnorePatternWhitespace de .NET. Ils sont très utiles car ils peuvent rendre une regex complexe beaucoup plus facile à lire. Premièrement, ai-je raté quelque chose et y a-t-il un Javascript intégré équivalent à ceux-ci? Deuxièmement, si ce n'est pas le cas, est-ce que quelqu'un connaît un bon plugin jQuery qui va implémenter cette fonctionnalité? C'est dommage de devoir compresser mon complexe regex en une seule ligne à cause des limitations de regex apparentes de Javascript.Ignorer les espaces dans les modèles d'expressions régulières Javascript?
Répondre
Si je vous comprends bien, vous voulez ajouter un espace blanc qui ne fait pas partie de l'expression rationnelle? Pour autant que je sache, ce n'est pas possible avec l'expression rationnelle littérale.
Exemple:
var a = /^[\d]+$/
Vous pouvez briser l'expression rationnelle dans plusieurs lignes comme ceci:
var a = RegExp(
"^" +
"[\\d]+" + // This is a comment
"$"
);
Notez que puisqu'il est désormais une chaîne normale, vous devez échapper \ avec \\
Ou si vous avez un complexe:
var digit_8 = "[0-9]{8}";
var alpha_4 = "[A-Za-z]{4}";
var a = RegExp(
digit_8 +
alpha_4 + // Optional comment
digit_8
);
Mise à jour: L'utilisation d'un tableau temporaire pour concaténer l'expression régulière:
var digit_8 = "[0-9]{8}";
var alpha_4 = "[A-Za-z]{4}";
var a = RegExp([
digit_8,
alpha_4, // Optional comment
digit_8,
"[0-9A-F]" // Another comment to a string
].join(""));
Oui, mais ce n'est pas la même chose. Vous avez la syntaxe de concaténation de chaînes JavaScript super laid, et vous ne pouvez toujours pas mettre des commentaires de style Perl à la fin des lignes, comme: h (a | o) t # <- correspond à chapeau ou chaud – Jez
@Jez: Mais vous pouvez mettre des commentaires JavaScript là-bas. Il n'y a pas d'autre moyen, malheureusement. JS ne prend pas en charge les expressions régulières verbeuses. –
JavaScript n'est pas perl. – Incognito
Malheureusement il n'y a pas une telle option dans ES5, et je soupçonne qu'il est peu probable que jamais dans RegExp
littéraux, parce qu'ils sont déjà très Difficile à analyser et les sauts de ligne les rendraient encore plus ambigus.
Si vous souhaitez un échappement facile et une coloration syntaxique des littéraux RegExp
, vous pouvez les joindre en profitant de la propriété source
. Ce n'est pas parfait, mais à mon humble avis moins mauvais que de tomber tout le chemin du retour à cordes:
new RegExp(
/foo/.source +
/[\d+]/.source +
/bar/.source
);
Dans ES6, vous pouvez créer votre propre chaîne de modèle:
regexp`
foo
[\d+]
bar
`;
function regexp(parts) {
// I'm ignoring support for ${} placeholders for brevity,
// but full implementation should escape them.
// Note that `.raw` allows use of \d instead of \\d.
return new RegExp(parts.raw.join('').replace(/\s+/g,''));
}
Pourquoi utiliser jQuery? jQuery n'est pas le seul moyen d'importer du code externe. –