解决方案是:
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
问题是:
我正在尝试设置研究功能。
基本上,我有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.
这是非常不可接受的。
答案 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上测试:
注意:如果匹配则返回匹配,而不是OK,如果不匹配则返回null