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

Например:

var lower = /[az]/; var upper = /[AZ]/; var alpha = upper|lower;//Is this possible? 

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

Ответ — да! Вы должны инициализировать переменную в классе 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); 

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

 var one = /[az]/; var two = /[AZ]/; var one_or_two = new RegExp("("   one.source   ")|("   two.source   ")") 

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

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

 var lower = /[az]/, upper = /[AZ]/, digit = /[0-9]/; // All of these are equivalent, and will evaluate to /(?:az)|(?:AZ)|(?: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 {amp}lt; 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)); }; 

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

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

 alpha = new RegExp( lower.source   "|"   upper.source ); console.log( alpha ); // /[az]|[AZ]/ 

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

 const Regexes = { Empty: /^$/, Minus: /^[-]$/, DotAndNumber: /^.d $/, NumberAndDot: /^d .$/, Float: /^[-]?d (.d )?$/, }; const orRegex = (...regexes) ={amp}gt; new RegExp(regexes.map(r ={amp}gt; r.source).join('|')); const FloatInputRegex = orRegex( Regexes.Empty, Regexes.Minus, Regexes.DotAndNumber, Regexes.NumberAndDot, Regexes.Float, ); 

используйте общую функцию:

 const getComposedRegex = (...regexes) ={amp}gt; new RegExp(regexes.map(regex ={amp}gt; regex.source).join("|")) 

Затем назовите его с любым количеством регулярных выражений.

 const reg1 = /[w]{3}/i const reg2 = /http/i const composedReg = getComposedRegex(reg1, reg2)