Объединение регулярных выражений в Javascript - PullRequest
41 голосов
/ 09 февраля 2012

Можно ли комбинировать регулярные выражения в javascript.

Например:

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

т.е.могу ли я присвоить переменным регулярные выражения и объединить эти переменные, используя символы сопоставления с образцом, как мы делаем в регулярных выражениях

Ответы [ 5 ]

44 голосов
/ 09 февраля 2012

Ответ - да!Вы должны инициализировать переменную в классе RegExp:

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

, следовательно, регулярное выражение может быть создано динамически.После создания:

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

Тогда вы можете объединить их как обычно, да.

var finalRe = new RegExp(lower.source + "|" + upper.source);
24 голосов
/ 09 февраля 2012

Если регулярные выражения заранее не известны,

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

var one_or_two = new RegExp("(" + one.source + ")|(" + two.source + ")")
7 голосов
/ 09 февраля 2012

Если это то, что вам нужно сделать только один или два раза, я бы придерживался этого в каждом конкретном случае, как предлагают другие ответы.

Однако, если вам нужно сделать многопара вспомогательных функций может улучшить читаемость.Например:

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);

А вот код, если вы хотите использовать эти функции:

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));
};

Альтернативы заключены в группы без захвата и объединены с оператором дизъюнкции, делаяэто несколько более надежный подход для более сложных регулярных выражений.

Обратите внимание, что вам нужно будет включить этот код перед вызовом вспомогательных функций!

2 голосов
/ 09 февраля 2012
alpha = new RegExp( lower.source + "|" + upper.source );
console.log( alpha );
// /[a-z]|[A-Z]/
0 голосов
/ 14 сентября 2018

На основе ответа Bry6n вот решение, которое я использую:

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,
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...