javascript:regex必须包含一个字符串,但它也不包含某个字符串

时间:2017-12-27 10:59:10

标签: javascript regex

我想要一个必须包含字符串且不包含其他字符串的正则表达式。

例如: 网址是:

/news/create

/news/5a40778e82264f0d689fc345

/news/5a40824382264f0d689fc347

/news/list

/files

/files/43er778e82264fref32fcre4

我只想获得:

/news/5a40778e82264f0d689fc345

/news/5a40824382264f0d689fc347

这意味着网址必须包含/news,但不应 /news/create/news/list。只需要像/news/:id这样的新闻详细信息。 其他网址如:/files/xxx 也不应返回。

我怎样才能让正则表达式获得那样的效果?

提前感谢。

4 个答案:

答案 0 :(得分:1)

试试这个正则表达式:

/\/news\/(?!create|list).*/

答案 1 :(得分:0)

您可以使用以下正则表达式

/^\/news\/[^a-zA-z]/g

var arr = ['/news/create','/news/5a40778e82264f0d689fc345','/news/5a40824382264f0d689fc347','/news/list','/files','/files/43er778e82264fref32fcre4'];

var result = arr.reduce((r, url) => {
  if(/^\/news\/[^a-zA-z]/g.test(url))
    r.push(url);
  return r;
},[]);

console.log(result);

答案 2 :(得分:0)

一种方法可能是使用正向前瞻来检查/news正则表达式之后是否至少有一个数字和至少一个小写字符:

^\/news\/(?=.*[a-z])(?=.*\d)[a-z\d]+$

<强>解释

  • 从字符串^
  • 的开头
  • 匹配/news/
  • 一个积极的前瞻,它至少断言一个小写字符(?=.*[a-z])
  • 一个积极的先行,断言至少一个数字(?=.*\d)
  • 匹配小写字符或数字一次或多次[a-z\d]+
  • 字符串$
  • 的结尾

如果要在字符串中找到该模式,可以使用单词边界\b结束,如:

\/news\/(?=.*[a-z])(?=.*\d)[a-z\d]+\b

答案 3 :(得分:0)

部分总结早期的答案;如果不接受有关ID和其他URL段之间差异的一些额外规范,则无法直接解决此问题。答案取决于您希望接受的额外规格:

  • ID的长度为24个字符:/^\/news\/[a-z0-9]{24}$/i
  • ID超过20个字符:/^\/news\/[a-z0-9]{20,}$/i
  • 您有其他网址的黑名单,例如createlist/^\/news\/(?!create|list)/i
  • 其他网址(例如/news/create)将永远不会包含任何数字:/^\/news\/(?=.*[a-z])(?=.*\d)[a-z\d]+$/i
  • (以上组合,例如,ID包含超过20个字符且至少包含1个数字:/^\/news\/(?=.*\d)[a-z0-9]{20,}$/i
  • 等。