六位数base36数字范围的Javascript正则表达式
我正在构建一个node.js应用程序,并将unix时间戳的六位数base36表示形式(以秒为单位)存储为Mongodb中_id的第一部分。典型的_id如下所示:六位数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
"_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上