在 Javascript 中组合正则表达式

IT技术 javascript regex
2021-02-16 23:57:27

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

例如:

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

IE。我可以将正则表达式分配给变量并像在正则表达式中那样使用模式匹配字符组合这些变量吗

6个回答

答案是肯定的!您必须在 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);
tonew RegExp(/a/)和 just有什么区别/a/吗?后者已经创建了一个 RegExp 实例。
2021-04-17 23:57:27
对于不确定的其他人,对我来说,这其中的关键部分是在我创建的 RegExp 文字上使用 .source 将其连接成字符串文字。
2021-05-01 23:57:27
lower 和 upper 也可以是正则表达式文字。
2021-05-07 23:57:27
@AlanMoore 抱歉,我会为了以后查看此内容的任何人的利益而修复它。
2021-05-14 23:57:27

如果事先不知道正则表达式,

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

var one_or_two = new RegExp("(" + one.source + ")|(" + two.source + ")")

如果这是你只需要做一两次的事情,我会坚持按照其他答案的建议逐案进行。

但是,如果您需要做很多事情,几个辅助函数可能会提高可读性。例如:

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

替代方案包含在非捕获组中,并与析取运算符相结合,使其成为更复杂的正则表达式的更强大的方法。

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

使用通用函数:

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

然后用任意数量的正则表达式调用它。

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

const composedReg = getComposedRegex(reg1, reg2)

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