Est-il possible de faire quelque chose comme ça?
var pattern = /some regex segment/ + /* comment here */
/another segment/;
Ou dois-je utiliser une nouvelle RegExp()
syntaxe et concaténer une chaîne? Je préférerais utiliser le littéral car le code est à la fois plus évident et concis.
javascript
regex
syntax
paupière
la source
la source
let regexSegment1 = String.raw`\s*hello\s*`
Réponses:
Voici comment créer une expression régulière sans utiliser la syntaxe littérale d'expression régulière. Cela vous permet de faire une manipulation de chaîne arbitraire avant qu'elle ne devienne un objet d'expression régulière:
Si vous avez deux littéraux d'expression régulière, vous pouvez en fait les concaténer en utilisant cette technique:
C'est juste plus verbeux que d'avoir les expressions un et deux qui sont des chaînes littérales au lieu d'expressions régulières littérales.
la source
new RegExp(/(/.source + /.*/.source + /)?/.source);
ne semble pas fonctionner.expression_one
? Voulez-vous direregex1
?La simple concaténation aléatoire d' objets d' expressions régulières peut avoir des effets secondaires indésirables. Utilisez plutôt RegExp.source :
Cela vous donnera également la possibilité de conserver les indicateurs d'expressions régulières d'un précédent RegExp en utilisant les indicateurs standard de RegExp.
jsFiddle
la source
RegExp.prototype.flags
Je ne suis pas tout à fait d'accord avec l'option "eval".
donnera "// abcd // efgh //" qui n'est pas le résultat attendu.
Utiliser une source comme
donnera "/ abcdefgh /" et c'est correct.
Logiquement il n'y a pas besoin d'EVALUER, vous connaissez votre EXPRESSION. Vous avez juste besoin de sa SOURCE ou de la façon dont elle est écrite pas nécessairement de sa valeur. En ce qui concerne les drapeaux, il vous suffit d'utiliser l'argument optionnel de RegExp.
Dans ma situation, je lance le problème de ^ et $ étant utilisé dans plusieurs expressions que j'essaye de concaténer ensemble! Ces expressions sont des filtres de grammaire utilisés dans le programme. Maintenant, je ne veux pas utiliser certains d'entre eux ensemble pour gérer le cas des PRÉPOSITIONS. Je devrai peut-être "découper" les sources pour supprimer le début et la fin ^ (et / ou) $ :) Cheers, Alex.
la source
var regex = "\.\..*"
Problème Si l'expression rationnelle contient des groupes de correspondance arrière tels que \ 1.
Ensuite, simplement contaténer les sources ne fonctionnera pas. En effet, la combinaison des deux est:
La solution: nous comptons d'abord le nombre de groupes correspondants dans la première expression régulière, puis pour chaque jeton de correspondance arrière dans la seconde, nous l'incrémentons du nombre de groupes correspondants.
Tester:
la source
function concatenateList() { var res = arguments[0]; for(var i = 1; i < arguments.length; i++) { res = concatenate(res, arguments[i]); } return res; }
Il serait préférable d'utiliser la syntaxe littérale aussi souvent que possible. Il est plus court, plus lisible et vous n'avez pas besoin de guillemets d'échappement ou de doubles échappements. Tiré de «Javascript Patterns», Stoyan Stefanov 2010.
Mais utiliser New peut être le seul moyen de concaténer.
J'éviterais eval. Ce n'est pas prudent.
la source
À condition que:
/this/g
plutôt quenew RegExp('this', 'g')
;Ensuite, vous pouvez écrire de cette façon:
vous pouvez alors faire quelque chose comme:
Dans mon cas particulier (un éditeur de type miroir de code), il est beaucoup plus facile d'exécuter une grande regex, plutôt que beaucoup de remplacements comme suit car chaque fois que je remplace par une balise html pour envelopper une expression, le modèle suivant sera être plus difficile à cibler sans affecter la balise html elle-même (et sans le bon lookbehind qui n'est malheureusement pas pris en charge en javascript):
la source
Vous pouvez faire quelque chose comme:
Les segments seraient des chaînes (plutôt que des littéraux regex) transmis en tant qu'arguments séparés.
la source
Non, la méthode littérale n'est pas prise en charge. Vous devrez utiliser RegExp.
la source
Utilisez le constructeur avec 2 paramètres et évitez le problème avec '/' de fin:
la source
Vous pouvez concaténer une source d'expression régulière à partir de la classe littérale et RegExp:
la source
le moyen le plus simple pour moi serait de concaténer les sources, ex .:
la valeur c se traduira par:
la source
Je préfère l'utiliser
eval('your expression')
car il n'ajoute pas le/
à chaque extrémité/
qui le='new RegExp'
fait.la source