只有在前面没有特定父段的情况下,才在Regex匹配url段
给定输入
http://example.com/my-slug
或http://example.com/my-slug/
要求是匹配
"my-slug"
但不匹配
"my-slug"
如果前面有
"news-events"
能够通过在Chromium上使用RegExp lookbacking断言来匹配"/my-slug"
或"/my-slug/"
,--harmony
标志设置为RegExp
// why is the `/` necessary following lookbehind?
let re = /(?<!news-events)/[^/]+(?=/$|$)/;
let sources = [
"http://example.com/my-slug"
, "http://example.com/my-slug/"
, "http://example.com/news-events/my-slug"
];
for (let src of sources) {
console.log(src.match(re))
}
然而,当试图通过在news-event/
处转义尾随的"/"
来精确匹配没有前一个"/"
字符的"my-slug"
时,RegExp
不会返回相同的匹配,其中,当预期结果为null
时,对"http://example.com/news-events/my-slug"
的匹配为"y-slug"
let re = /(?<!news-events/)[^/]+(?=/$|$)/;
let sources = [
"http://example.com/my-slug"
, "http://example.com/my-slug/"
, "http://example.com/news-events/my-slug"
];
for (let src of sources) {
console.log(src.match(re))
}
问题:
-
为什么转义的
"/"
字符不包含在RegExp
查找背后否定断言中? -
如何正确地转义字符或以其他方式调整
RegExp
后备断言以否定完整字符串"news-events/"
并返回预期结果"my-slug"
,而不需要在应该匹配的字符串部分之前包括/
?
由于正则表达式的这一位:
[^/]+(?=/$|$)
与文本y-slug
匹配(y-slug
是多个非斜杠字符,可选地后跟一个斜杠,后跟字符串末尾),并且y-slug
前面没有news-events/
,这是有效的匹配。由于my-slug
不匹配,它也是第一个有效的匹配,因此它是返回的匹配。
您可以添加第二个正后方,以指示任何匹配都必须是一个完整的分段。
let re = /(?<!news-events/)(?<=/)[^/]+(?=/$|$)/;
let sources = [
"http://example.com/my-slug"
, "http://example.com/my-slug/"
, "http://example.com/news-events/my-slug"
];
for (let src of sources) {
console.log(src.match(re))
}