在Javascript中组合正则表达式

Combining regular expressions in Javascript

本文关键字:正则表达式 组合 Javascript      更新时间:2023-09-26

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

例如:

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

即。我可以将正则表达式分配给变量,并使用模式匹配字符将这些变量组合为我们在正则表达式中这样做

答案是肯定的!您必须初始化RegExp类下的变量:

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

因此,regex可以动态创建。创建后:

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

然后你可以正常地组合它们,是的。

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

如果事先不知道regexp,

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

使用一个通用函数:

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

然后用任意数量的Regex调用它。

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

如果这是你只需要做一两次的事情,我会坚持按照其他答案的建议,根据具体情况来做。

然而,如果您需要做很多工作,那么使用几个辅助函数可能会提高可读性。例如:

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

备选方案被封装在非捕获组中,并与析取运算符相结合,这使得对于更复杂的正则表达式来说,这是一种更稳健的方法。

请注意,在调用helper函数之前,您需要包含此代码

基于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,
);
alpha = new RegExp( lower.source + "|" + upper.source );
console.log( alpha );
// /[a-z]|[A-Z]/