JavaScript中在正则表达式中使用变量

3
使用正则表达式匹配以下模式 - 5点到6点,上午4点到9点,下午3点到8点,4点到9点... 我已经有了匹配“5点,下午4点,上午5点”的正则表达式... 我想使用这个正则表达式来匹配上午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)

这个正则表达式匹配类似于4h、5pm、8am等模式。

而这个变量用于匹配4am到9am之间的时间段。

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

有可能吗?如果可以,怎么做呢?


4
你不能直接合并两个正则表达式对象。你可以取两个指定正则表达式的字符串,将这两个字符串合并,然后执行 var regex = new RegExp(str1 + str2) 或者甚至是 var regex = new RegExp("(" + str1 + ")" + str2)。所以,基本上使用来自其他字符串变量的字符串操作构建正则表达式字符串,然后从该组合字符串创建一个新的正则表达式。 - jfriend00
str1 = "pattern(/s+)" msg = "pattern pattern matching pattern pattern." var re = new RegExp(str1, "g"); var temp = msg.match(re); 在这种情况下,temp为空...因为我添加了/s+,如何在pattern后面添加空格..???? - Bhumi Patel
如果你想将时间作为不同的值提取出来,那么首先要根据逗号和"to"进行字符串分割,包括每个分割部分中的可选空格。 - bloodyKnuckles
可能是重复的问题:JavaScript中合并正则表达式 - Stephan
2个回答

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
如果您的正则表达式变得复杂并且在某些时候难以阅读,您可以考虑使用语法方法。语法可以声明为对象,其中符号作为键,相应的产生式作为值。实际上,产生式只是正则表达式,但具有特殊的符号语法(如 @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:在正则表达式出现之前,形式化语法已经存在很久了。 - georg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接