Combinaison d'expressions régulières en Javascript

Est-il possible de combiner des expressions régulières en javascript.

Par exemple:

 var lower = /[a-z]/;
 var upper = /[A-Z]/;
 var alpha = upper|lower;//Is this possible?

Ie. puis-je assigner des expressions régulières aux variables et combiner ces variables en utilisant des caractères de correspondance de modèle comme nous faisons dans les expressions régulières

27
demandé sur Alan Moore 2012-02-09 19:01:53

5 réponses

La réponse est oui! Vous devez initialiser la variable sous la classe RegExp:

var lower = new RegExp(/--RegexCode--/);
var upper = new RegExp(/--RegexCode--/);

Par conséquent, regex peut être créé dynamiquement. Après la création:

"sampleString".replace(/--whatever it should do--/);

Ensuite, vous pouvez les combiner normalement, Oui.

var finalRe = new RegExp(lower.source + "|" + upper.source);
29
répondu Bry6n 2012-02-10 03:19:24

Si les expressions rationnelles ne sont pas connues au préalable,

var one = /[a-z]/;
var two = /[A-Z]/;

var one_or_two = new RegExp("(" + one.source + ")|(" + two.source + ")")
18
répondu georg 2012-02-09 15:10:48

Si c'est quelque chose que vous n'avez besoin de faire qu'une ou deux fois, je m'en tiendrais à le faire au cas par cas, comme suggéré par d'autres réponses.

Si vous avez besoin de faire beaucoup, cependant, quelques fonctions d'aide pourraient améliorer la lisibilité. Par exemple:

var lower = /[a-z]/,
    upper = /[A-Z]/,
    digit = /[0-9]/;

// All of these are equivalent, and will evaluate to /(?:a-z)|(?:A-Z)|(?:0-9)/
var anum1 = RegExp.any(lower, upper, digit),
    anum2 = lower.or(upper).or(digit),
    anum3 = lower.or(upper, digit);

Et voici le code si vous voulez utiliser ces fonctions:

RegExp.any = function() {
    var components = [],
        arg;

    for (var i = 0; i < arguments.length; i++) {
        arg = arguments[i];
        if (arg instanceof RegExp) {
            components = components.concat(arg._components || arg.source);
        }
    }

    var combined = new RegExp("(?:" + components.join(")|(?:") + ")");
    combined._components = components; // For chained calls to "or" method
    return combined;
};

RegExp.prototype.or = function() {
    var args = Array.prototype.slice.call(arguments);
    return RegExp.any.apply(null, [this].concat(args));
};

Les alternatives sont enveloppées dans des groupes non capturants et combinées avec l'opérateur disjonction, ce qui en fait une approche un peu plus robuste pour plus expressions régulières complexes.

Notez que vous aurez besoin d'inclure ce code avant appeler les fonctions d'assistance!

6
répondu Jordan Gray 2012-02-09 17:10:23
alpha = new RegExp( lower.source + "|" + upper.source );
console.log( alpha );
// /[a-z]|[A-Z]/
2
répondu Esailija 2012-02-09 15:12:44

Basé sur la réponse Bry6n voici une solution que j'utilise:

const Regexes = {
  Empty: /^$/,
  Minus: /^[-]$/,
  DotAndNumber: /^\.\d+$/,
  NumberAndDot: /^\d+\.$/,
  Float: /^[-]?\d+(\.\d+)?$/,
};

const orRegex = (...regexes) =>
  new RegExp(regexes.map(r => r.source).join('|'));

const FloatInputRegex = orRegex(
  Regexes.Empty,
  Regexes.Minus,
  Regexes.DotAndNumber,
  Regexes.NumberAndDot,
  Regexes.Float,
);
0
répondu Sebastien Lorber 2018-09-14 10:26:28