如何匹配大量短版本之间的长路径

时间:2015-05-14 13:54:32

标签: javascript regex

解决方案是:

var str = this.path;
var spltd = str.split('/');
var agg = '(?:';
var e = 'Item';
for (i = 0; i < spltd.length-2; i++) { agg += '(?:';}
var newstr = '^(?:\/?'+agg+spltd.join('\/)?')+'::)?'+e;
var regex = new RegExp(newstr);
var check = str.match(regex);
console.log(check); // Works on the good cases, not on the bad

感谢@RodrigoLópez

问题是:

我正在尝试设置研究功能

基本上,我有paths喜欢:

Item    
Path::Item
/Path::Item
Long/Path::Item
/Long/Path::Item
Very/Long/Path::Item
/Very/Long/Path::Item
Very/Very/Long/Path::Item
/Very/Very/Long/Path::Item
My/Very/Very/Long/Path::Item

存储在 javascript Object中。 现在,我需要.match(),其中任何一个使用full path

My/Very/Very/Long/Path::Item

这方面并不容易......

我试过了:

//NOTE : if it's match it returns 'OK'

var str = 'My/Very/Very/Long/Path';
var spltd = str.split('/');
var newstr = '('+spltd.join('/)?(')+')$';//alert(newstr);
var regex = new RegExp(newstr);
var check = str.match(regex);
console.log(check); // 'OK'

我不能说它不起作用但它仍然很准确。 它在很多情况下会返回“OK”....

str =

时相同
My/Very/Long/Path::Item
My/Long/Path::Item
Very/Path::Item
etc.

这是非常不可接受的。

1 个答案:

答案 0 :(得分:2)

它不漂亮,但这个正则表达式完成了工作:

^(?:\/?(?:(?:(?:(?:My\/)?Very\/)?Very\/)?Long\/)?Path::)?Item

您可以将代码更改为:

var str = 'My/Very/Very/Long/Path::Item';
var regex = new RegExp('^(?:\\/?(?:(?:(?:(?:My\\/)?Very\\/)?Very\\/)?Long\\/)?Path::)?Item');
var check = str.match(regex);

在Regexr.com上测试:

enter image description here

注意:如果匹配则返回匹配,而不是OK,如果不匹配则返回null