gpt4 book ai didi

javascript - 在 RegExp 回溯断言中转义字符

转载 作者:行者123 更新时间:2023-11-30 21:04:20 26 4
gpt4 key购买 nike

Regex to match url segment only if not preceded by specific parent segment

给定输入

http://example.com/my-slughttp://example.com/my-slug/

要求是匹配

“我的鼻涕虫”

但不匹配

“我的鼻涕虫”

如果前面有

“新闻事件”

能够通过使用 RegExp lookbehind assertions 匹配 "/my-slug""/my-slug/"在 Chromium 中使用 --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))
}

然而,当试图通过转义尾随的 "/" 来精确匹配 "my-slug" 而不在前面的 "/" 字符时news-event/ RegExp 不返回相同的匹配项,其中匹配项为 "http://example.com/news-events/my-slug""y-slug" 当预期结果是 null

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))
}

关于javascript - 在 RegExp 回溯断言中转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46802270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com