在 Javascript 中组合正则表达式

是否可以在 javascript 中组合正则表达式。

例如:

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

例如,我是否可以将正则表达式赋给变量,并将这些变量使用模式匹配字符组合为 我们在正则表达式中做

56311 次浏览

If regexps are not known beforehand,

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


var one_or_two = new RegExp("(" + one.source + ")|(" + two.source + ")")
alpha = new RegExp( lower.source + "|" + upper.source );
console.log( alpha );
// /[a-z]|[A-Z]/

The answer is yes! You have to initialize the variable under the RegExp class:

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

hence, regex can be dynamically created. After creation:

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

Then you can combine them normally, yes.

var finalRe = new RegExp(lower.source + "|" + upper.source);

If this is something you only need to do once or twice, I'd stick with doing it on a per-case basis as suggested by other answers.

If you need to do a lot, however, a couple of helper functions might improve readability. For example:

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

And here's the code if you want to use those functions:

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

The alternatives are wrapped in non-capturing groups and combined with the disjunction operator, making this a somewhat more robust approach for more complex regular expressions.

Note that you will need to include this code before calling the helper functions!

Based on Bry6n answer here's a solution I use:

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

use a general function:

const getComposedRegex = (...regexes) => new RegExp(regexes.map(regex => regex.source).join("|"))

Then call it with any number of Regexes.

const reg1 = /[w]{3}/i
const reg2 = /http/i


const composedReg = getComposedRegex(reg1, reg2)