【问题标题】:Combining regular expressions in Javascript在 Javascript 中组合正则表达式
【发布时间】:2012-03-02 01:31:57
【问题描述】:

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

例如:

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

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

【问题讨论】:

  • 你有两个独立的正则表达式还是只想要/[a-zA-Z]/
  • 我知道....我需要知道这是否可能
  • Combine Regexp 的可能重复项
  • 所有答案的问题是标志会被吹走。您不能在 JavaScript 中组合任意正则表达式,因为它缺少 (?flags:matchtext) 构造。
  • 是的,这是一个特别有用的feature of Perl's extended regular expressions;除了重新实现或包装来替换本机正则表达式功能(例如XRegExp)之外,在 JavaScript 中没有办法做到这一点。

标签: javascript regex


【解决方案1】:

答案是肯定的!您必须在 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);

【讨论】:

  • @AlanMoore 抱歉,为了方便以后查看此问题的任何人,我会修复它。
  • lower 和upper 也可以是正则表达式字面量。
  • new RegExp(/a/)/a/ 有什么区别吗?后者已经创建了一个 RegExp 实例。
  • 对于其他不确定的人来说,这对我来说的关键部分是在我创建的 RegExp 文字上使用 .source 将其连接成字符串文字。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

      使用通用函数:

      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)
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:
          alpha = new RegExp( lower.source + "|" + upper.source );
          console.log( alpha );
          // /[a-z]|[A-Z]/
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-18
            • 1970-01-01
            • 2023-03-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多