仅当不在特定父段之前时,正则表达式才匹配url段

时间:2017-10-17 05:45:59

标签: javascript regex

我尝试匹配网址的最后一段,当且仅当它没有特定段之前(' news-events')。所以,例如,我想匹配我的slug'这里:

http://example.com/my-slug

......但不在这里:

http://example.com/news-events/my-slug

我正在使用javascript - 尝试过类似的内容:

\b(?!news-events)(\/\w+)\b$

...但是字边界方法在这里不起作用,因为/ char充当了片段之间的边界(因此,最后一个片段被选中,无论它是否在前面被'新闻事件'

任何想法都会受到赞赏。

非常感谢。

3 个答案:

答案 0 :(得分:3)

针对可选的尾部斜杠

进行了更新

不要被愚弄,这是一个棘手的正则表达式。

/^(?:(?!news-events\/[^\/\r\n]*\/?$).)*?\/([^\/\r\n]+)\/?$/

该段位于捕获组1中。

https://regex101.com/r/hrLqRq/3

 ^     
 (?:
      (?! news-events/ [^/\r\n]* /? $ )
      . 
 )*?
 / 
 ( [^/\r\n]+ )                 # (1)
 /?
 $ 

答案 1 :(得分:1)

您可以尝试在正斜杠上拆分URL,然后检查倒数第二个条目是不是 news-events,最后一个条目是my-slug

var url = 'http://example.com/news-events/my-slug';
var parts = url.split('/');
var n = parts.length

if (parts[n - 2] !== 'news-events' && parts[n - 1] === 'my-slug') {
    console.log("match")
}
else {
    console.log("no match")
}

答案 2 :(得分:1)

您可以查看.pathname或一个或多个字词的网址



let sources = [
  "http://example.com/my-slug"
, "http://example.com/news-events/my-slug"
];


let match = "/my-slug";

let not = "/news-events";

for (let src of sources) {
  let url = new URL(src);
  if (new RegExp(`^${not}${match}`).test(url.pathname)) {
    console.log("not", url.pathname)
  } else {
    if (new RegExp(`^${match}$`).test(url.pathname))
    console.log("ok", url.pathname)
  }
}