我构建了一个node.js应用程序,并将一个unix时间戳的六位数base36表示(以秒为单位)存储为Mongodb中一个_id的第一部分。一个典型的_id是这样的:Javascript正则表达式,适用于六位数的base36数字
"_id" : "lwhlzy/czwszasfgr/a4d18976c1/f835caa1c3/184d06b47f"
数据的几件被连接,包括时间戳随后进行了一系列散列数据的形成既是GUID和“materialized path”
后来查询将选择记录基于时间范围,然后是获取该时期内发生的特定路径事件的路径。这些查询将依赖于rooted regular expressions,所以我需要一个正则表达式,可以找到一系列base36数字:
这是我到目前为止的代码(测试通过节点运行,是的,它是硬编码到六位数字。不会被需要的第七位,直到12月23日2038)
var base36 = "abcdefghijklmnopqrstuvwxyz";
// determine how many left-most characters from & to have in common
// this function works nicely, no problems here
var getOverlap = function (from, to) {
regex = '';
count = to.length;
for (i in to) {
regex += (i>0?'|':'')+'('+to.slice(0,count)+')';
count--;
}
result = from.match(RegExp(regex,"ig"));
return result[0];
};
var from = "lec0s0";
var to = "lwhvqg"; // generated from: parseInt(Date.now()/1000,10).toString(36)
var overlap = getOverlap(from,to);
console.log(from);
console.log(to);
var regex = overlap;
var i = overlap.length;
// start immediately after the left-most common characters and append the rest of the regex
while (i<6) {
regex += "[";
if (from[i] < to[i]) {
regex += base36.slice(base36.indexOf(from[i]), base36.indexOf(to[i])+1);
} else {
regex += base36.slice(base36.indexOf(from[i])) + base36.slice(0, base36.indexOf(to[i])+1);
}
regex += "]";
i++;
}
console.log(regex);
process.exit();
将输出是这样的:
l[efghijklmnopqrstuvw][cdefgh][abcdefghijklmnopqrstuv][stuvwxyzabcdefghijklmnopq][abcdefg]
研究之后,我意识到有两个主要问题与此:1)它的对于真正的范围来说不太合适(它会跳过大量的记录s)和2)Id宁可有字符范围喜欢[e-w]
而不是每个字符明确陈述,虽然它仍然有效。
对于输入from="lec0s0"
和to="lwhvqg"
我意识到我错过了这个正则表达式的很大一部分。例如,上面的代码只允许第三个字符的范围从c-h
,但该位置需要在第二个字符增加之前达到“z”。我确定我确实需要一个正则表达式,看起来更像是这样的:
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]
所以我的问题是:我是对的结束正则表达式需要像后者之上?如果是这样,我该如何修改代码来生成它?
在此先感谢!
看起来不错,谢谢! – talentedmrjones 2011-12-21 19:34:47
嘿,我得到这个错误:“范围乱序在字符类”为这个正则表达式:“lwq0x [8-9a-z] | lwq0 [yz] [0-9a-z] {1} | lwq [1 -9a-Z] [0-9A-Z] {2} | LW [RQ] [0-9A-Z] {3} | LWR [0-9A-U] [0-9A-Z] {2} | lwrv [0-9a-k] [0-9a-z] {1} | lwrvl [0-8]“ 我认为这是”rq“。有任何想法吗?谢谢! – talentedmrjones 2011-12-25 18:36:50
现在已经添加了'getRange'中的缺失检查。看看我更新的答案 - 我也更新了小提琴,寻找行'if(base36.indexOf(f)> = base36.indexOf(t))' – 2011-12-25 21:46:38