【问题标题】:Use Variable in Regular Expression in javascript在 javascript 的正则表达式中使用变量
【发布时间】:2015-01-20 06:10:49
【问题描述】:

使用正则表达式匹配此模式 - 5h 到 6h,4am 到 9am,3pm 到 8pm,4h 到 9pm......

我已经有了正则表达式 - 5h, 4pm, 5am......

我想用这个正则表达式来匹配凌晨 4 点到 9 点。

like var reg_expr = (/(\d{1,2}?h$)|(\d{1,2}h(?=\s+))|(\d{1,2}:\d{2}([ap]m)?$)|(\d{1,2}:\d{2}([ap]m)(?=\s+))|(\d{1,2}:\d{2}(?=\s+))|(\d{1,2}([ap]m)?$)|(\d{1,2}([ap]m)(?=\s+))/gi)

这个 reg_expr 匹配 4h,5pm,8am.....

这个变量在凌晨 4 点到 9 点的比赛中使用,

like var reg_data = ((reg_expr)(/\s(to)(?=\s)/gi)(reg_expr))...

有可能吗???? 如果是,那么如何???

【问题讨论】:

  • 不能直接组合两个正则表达式对象。您可以获取指定正则表达式的两个字符串并将这两个字符串组合起来,然后执行var regex = new RegExp(str1 + str2) 甚至var regex = new RegExp("(" + str1 + ")" + str2)。因此,基本上使用来自其他字符串变量的字符串操作来构建正则表达式字符串,然后从该组合字符串创建一个新的正则表达式。
  • str1 = "pattern(/s+)" msg = "模式模式匹配模式模式。" var re = new RegExp(str1, "g"); var temp = msg.match(re);在这种情况下 temp 为空...因为我添加 /s+ ,如何在模式后添加空格..????
  • 如果你想将时间作为不同的值提取出来,那么首先用逗号分割字符串,然后用 "to" 分割字符串,包括每个分割中的可选空格。

标签: javascript regex


【解决方案1】:

有可能吗????

是的

如果是那怎么办???

您可以通过调用#toString 方法或使用source 属性来获取RegExp 对象的字符串表示形式。

此外,您可以从字符串创建RegExp 对象。

var reg_expr = /(\d{1,2}?h$)|(\d{1,2}h(?=\s+))|(\d{1,2}:\d{2}([ap]m)?$)|(\d{1,2}:\d{2}([ap]m)(?=\s+))|(\d{1,2}:\d{2}(?=\s+))|(\d{1,2}([ap]m)?$)|(\d{1,2}([ap]m)(?=\s+))/;

var reg_data = new RegExp(
    reg_expr.source + 
    /\s(to)(?=\s)/.source +
    reg_expr.source,
    'gi'
);

alert(reg_data.source);

【讨论】:

    【解决方案2】:

    如果您的正则表达式很复杂并且在某些时候变得不可读,您可以考虑使用语法方法。语法可以声明为对象,符号作为键,对应的产生式作为值。产生式实际上只是正则表达式,但具有特殊的符号语法(如@symbol)和空格以提高可读性。当你需要一个符号的正则表达式时,你(很容易地)动态创建它:

    // grammar for time intervals
    
    times = {
        'space'   : '\\s+',
        'digit'   : '\\d',
        'hours'   : '@digit @digit?',
        'minutes' : ': @digit @digit',
        'suffix'  : 'h | am | pm',
        'time'    : '@hours @minutes? @suffix?',
        'interval': '@time @space to @space @time'
    };
    
    // convert a grammar rule to regex
    
    function regex(grammar, symbol, flags) {
    
        function expand(s) {
            return s.replace(/@(\w+)/g, function(_, $1) {
                return '(?:' + expand(grammar[$1]) + ')';
            });
        }
    
        return new RegExp(
            expand(grammar[symbol]).replace(/\s+/g, ''),
            flags);
    }
    
    // test!
    
    interval = regex(times, 'interval', 'g');
    test = '5h to 6h,4am to 9am,3pm to 8pm,4h to 9pm';
    document.write(test.match(interval).join(' ; '));

    【讨论】:

    • @Stephan:正式语法早在正则表达式之前就已经存在了。
    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2012-07-07
    相关资源
    最近更新 更多