我正在将URL传递给我需要在正则表达式中插入新元素的代码块。非常确定正则表达式是有效的,代码似乎是正确的,但不管我似乎无法执行正则表达式的匹配!
//** Incoming url's
//** url e.g. api/223344
//** api/11aa/page/2017
//** Need to match to the following
//** dir/api/12ab/page/1999
//** Hence the need to add dir at the front
var url = req.url;
//** pass in: /^\/api\/([a-zA-Z0-9-_~ %]+)(?:\/page\/([a-zA-Z0-9-_~ %]+))?$/
var re = myregex.toString();
//** Insert dir into regex: /^dir\/api\/([a-zA-Z0-9-_~ %]+)(?:\/page\/([a-zA-Z0-9-_~ %]+))?$/
var regVar = re.substr(0, 2) + 'dir' + re.substr(2);
var matchedData = url.match(regVar);
matchedData === null ? console.log('NO') : console.log('Yay');
我希望我只是错过了显而易见的但有人可以看到为什么我无法匹配并且总是返回NO?
由于
答案 0 :(得分:2)
让我们分解你的正则表达式
^\/api\/
这匹配字符串的开头,它看起来完全匹配字符串“/ api”
([a-zA-Z0-9-_~ %]+)
这是一个捕获组:这个捕获组专门捕获这些括号内的任何内容,+
表示捕获1个或更多,所以例如,此部分将匹配{{1} }
abAB25-_ %
这也将多个令牌组合在一起,但不会像上面那样创建一个捕获组((?:\/page\/([a-zA-Z0-9-_~ %]+))
使其无法捕获)。您首先匹配的字符串与“/ page /”完全匹配,后面跟上面段落中提到的完全相同的组(匹配a-z,A-Z,0-9等。
?:
在最后,?$
表示捕获0或更多的优先组,?
匹配字符串的结尾
此正则表达式将匹配此字符串,例如:$
然而,您可以利用捕获组,并使用类似的东西来获得类似的结果:/api/abAB25-_ %/page/abAB25-_ %
。在这里,我们使用^\/api\/([a-zA-Z0-9-_~ %]+)\/page\/\1?$
来引用第一个捕获组并匹配它匹配的完全相同的标记。编辑:实际上,这可能不会起作用,因为/ api /之后的文本和/ page /之后的文本很可能会有所不同,继续...
之后,您正在搜索开头添加“dir”,因此您现在可以匹配这样的内容:\1
您现在还将正则表达式转换为字符串,就像Crayon Violent在评论中指出的那样,这将打破您预期的功能。您可以在正则表达式上使用dir/api/abAB25-_ %/page/abAB25-_ %
来解决此问题:.source
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source
现在您可以正确匹配这样的字符串:var matchedData = url.match(regVar.source);
请参阅此示例:https://repl.it/Mj8h
答案 1 :(得分:0)
正如Crayon Violent在评论中所提到的,似乎你在.match()函数中传递了一个String而不是一个正则表达式。也许可以尝试以下方法:
url.match(new RegExp(regVar, "i"));
将字符串转换为正则表达式。 "我"是为了忽略的情况;不知道你想要什么。点击此处了解更多信息:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp