Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
六位数base36数字范围的Javascript正则表达式_Javascript_Regex_Node.js - Fatal编程技术网

六位数base36数字范围的Javascript正则表达式

六位数base36数字范围的Javascript正则表达式,javascript,regex,node.js,Javascript,Regex,Node.js,我正在构建一个node.js应用程序,并将unix时间戳的六位数base36表示形式(以秒为单位)存储为Mongodb中_id的第一部分。典型的_id如下所示: "_id" : "lwhlzy/czwszasfgr/a4d18976c1/f835caa1c3/184d06b47f" l[efghijklmnopqrstuvw][cdefgh][0123456789abcdefghijklmnopqrstuv][stuvwxyz0123456789abcdefghijklmnopq][01234

我正在构建一个node.js应用程序,并将unix时间戳的六位数base36表示形式(以秒为单位)存储为Mongodb中_id的第一部分。典型的_id如下所示:

"_id" : "lwhlzy/czwszasfgr/a4d18976c1/f835caa1c3/184d06b47f"
l[efghijklmnopqrstuvw][cdefgh][0123456789abcdefghijklmnopqrstuv][stuvwxyz0123456789abcdefghijklmnopq][0123456789abcdefg]
l[e-v][0-9a-z][0-9a-z][0-9a-z][0-9a-z]|l[e-w][c-g][0-9a-z][0-9a-z][0-9a-z]|l[e-w][c-h][0-9a-u][0-9a-z][0-9a-z]|l[e-w][c-h][0-9a-v][0-9a-o][0-9a-z]|l[e-w][c-h][0-9a-v][0-9a-q][0-9a-g]
连接了多个数据段,包括时间戳和一系列哈希数据,以形成GUID和“”

稍后的查询将根据时间范围选择记录,然后是路径,以获取该特定路径在该时间段内发生的事件。这些查询将依赖于,因此我需要一个可以找到base36数字范围的正则表达式:

这是我到目前为止的代码(一个通过node运行的测试,是的,它硬编码为六位数字。第七位数字直到2038年12月23日才需要。)

在研究了这一点之后,我意识到这有两个主要问题:1)对于一个真正的范围(它会跳过大量的记录)来说,它不太合适;2)我宁愿使用像
[e-w]
这样的字符范围,而不是每个字符都明确地表示出来,尽管它仍然有效

对于输入
from=“lec0s0”
to=“lwhvqg”
我意识到我缺少这个正则表达式的大部分。例如,上面的代码只允许第三个字符的范围为
c-h
,但该位置需要达到“z”才能增加第二个字符。我已经确定我实际上需要一个看起来更像这样的正则表达式:

"_id" : "lwhlzy/czwszasfgr/a4d18976c1/f835caa1c3/184d06b47f"
l[efghijklmnopqrstuvw][cdefgh][0123456789abcdefghijklmnopqrstuv][stuvwxyz0123456789abcdefghijklmnopq][0123456789abcdefg]
l[e-v][0-9a-z][0-9a-z][0-9a-z][0-9a-z]|l[e-w][c-g][0-9a-z][0-9a-z][0-9a-z]|l[e-w][c-h][0-9a-u][0-9a-z][0-9a-z]|l[e-w][c-h][0-9a-v][0-9a-o][0-9a-z]|l[e-w][c-h][0-9a-v][0-9a-q][0-9a-g]
所以我的问题是:我得出的结论是正则表达式需要像上面的后者一样,对吗?如果是这样,我应该如何修改代码来生成它


提前谢谢

我只想指出你模式中的一个错误

l[e-v][0-9a-z][0-9a-z][0-9a-z][0-9a-z]|l[e-w][c-g][0-9a-z][0-9a-z][0-9a-z]|l[e-w][c-h][0-9a-u][0-9a-z][0-9a-z]|l[e-w][c-h][0-9a-v][0-9a-o][0-9a-z]|l[e-w][c-h][0-9a-v][0-9a-q][0-9a-g]

l[e-v][0-9a-z][0-9a-z][0-9a-z][0-9a-z]|lw[c-g][0-9a-z][0-9a-z][0-9a-z]|lwh[0-9a-u][0-9a-z][0-9a-z]| ...
                                        ^                               ^^

在标记的位置,您不需要重复不必要的范围,因为您在第一个备选方案中涵盖了以“le”开头的模式。

您当前的模式将从
le0000
开始匹配,您实际上希望匹配:

lec0s[0-9a-z]|lec0[t-z][0-9a-z]{1}|lec[1-9a-z][0-9a-z]{2}|le[d-z][0-9a-z]{3}|l[f-v][0-9a-z]{4}|lw[0-9a-g][0-9a-z]{3}|lwh[0-9a-u][0-9a-z]{2}|lwhv[0-9a-p][0-9a-z]{1}|lwhvq[0-9a-g]
以下函数应为您提供所需的正则表达式:

function getRegex(from,to) {
    var base36 = '0123456789abcdefghijklmnopqrstuvwxyz',
        getRange = function(f,t) {
            if(f == t) {
                return f;
            }
            if(base36.indexOf(f) >= base36.indexOf(t)) {
                return t;
            } 
            if(t <= '9' || f >= 'a'){
                return '[' +f+'-'+t+']';
            }
            return '[' +f+(f<'9'?'-9':'')+(t>'a'?'a-':'')+t+']';    
        },
        from = from.split(''),
        to = to.split(''),
        prefix='', 
        regex=[], 
        tmp,i,l;

    for(i=0,l=from.length;i<l;i++) {
        if(from[i]!=to[i]) {
            break;
        }
        prefix+=from[i];
    }
    from.splice(0,prefix.length);
    to.splice(0,prefix.length);

    i = from.length;
    while(i--) {
        tmp = prefix+from.slice(0,i).join('');
        if(from[i] == 'z') {
            tmp+='z';
        }
        else if(from.length-i == 1) {
            tmp += getRange(from[i],'z');
        }
        else if(i) {
            tmp += getRange(base36.charAt(base36.indexOf(from[i])+1),'z');
            tmp += '[0-9a-z]{'+(from.length-i-1)+'}';
        } 
        else {
            tmp += getRange(base36.charAt(base36.indexOf(from[i])+1),base36.charAt(base36.indexOf(to[i])-1));
            tmp += '[0-9a-z]{'+(from.length-i-1)+'}';
        }
        regex.push(tmp);
    }
    for(i=1,l=to.length;i<l;i++) {
        tmp = prefix+to.slice(0,i).join('');
        if(to[i] == '0') {
            tmp+='0';
        }
        else if(to.length-i == 1) {
            tmp += getRange('0',to[i]);
        }
        else {
            tmp += getRange('0',base36.charAt(base36.indexOf(to[i])-1));
            tmp += '[0-9a-z]{'+(from.length-i-1)+'}';
        } 
        regex.push(tmp);
    }

    return regex.join('|');
}
函数getRegex(从,到){ var base36='0123456789ABCDEFGHIjklmnopqrstuvxyz', getRange=函数(f,t){ 如果(f==t){ 返回f; } if(base36.indexOf(f)>=base36.indexOf(t)){ 返回t; } 如果(t='a'){ 返回'['+f+'-'+t+']'; } 返回“[”+f+(f'a'?“a-”:”)+t+”; }, from=from.split(“”), to=to.split(“”), 前缀=“”, 正则表达式=[], tmp,i,l;
for(i=0,l=from.length;哦,我明白了!是的,这很有道理,谢谢!关于如何编写代码有什么想法吗?我肯定我能理解,但离假期越近,我的大脑就越慢:)抱歉,德国的bed时间到了。通常我会说,正则表达式不擅长检查数字范围,您应该提取数字并使用正常的数字比较器。但是我不知道base36是否存在这样的情况。嘿,我得到了这个错误:“字符类中的范围混乱”这个正则表达式:“lwq0x[8-9a-z]| lwq0[y-z][0-9a-z]{1}|lwq[1-9a-z][0-9a-z]{2}|lw[r-q][0-9a-z]{3}|lwr[0-9a-u][0-9a-z]{2}|lwrv[0-9a-k][0-9a-z]{1}| LWRVLVLVLVL 0-8]“我认为是“r-q”在做这件事。有什么想法吗?谢谢!在
getRange
中有一个缺少的签入项,现在已经添加了。看看我的最新答案,看看我的基线,如果有更新过的话,请看一下(XOF 36)>=base36.indexOf(t))谢谢Martin!你可以参加合同工作吗?如果有兴趣,我在twitters@talentedmrjones上