在javascript中使用正则表达式中的变量

时间:2015-01-20 06:10:50

标签: javascript regex

使用正则表达式匹配此模式 - 5h到6h,凌晨4点到9点,下午9点到晚上8点到晚上9点......

我已经正常表达了 - 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))...

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

2 个答案:

答案 0 :(得分:2)

  

有可能。???

  

如果是,则如何???

您可以通过调用#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);

答案 1 :(得分:1)

如果你的正则表达式很复杂并且在某些时候变得不可读,你可能会考虑语法方法。语法可以声明为对象,符号作为键,相应的作品作为值。制作实际上只是正则表达式,但具有符号的特殊语法(如@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(' ; '));