RegExp查找背后断言中的转义字符



只有在前面没有特定父段的情况下,才在Regex匹配url段

给定输入

http://example.com/my-slughttp://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))
}

最新更新