如何在行的开头_或_结尾处匹配正则表达式?

时间:2016-10-08 05:20:02

标签: javascript regex

我试图在行的开头末尾创建一个匹配!next的JS正则表达式。

目前,我正在使用/(^!next|!next$)/i。然而,这显然有点难看,而不是干,所以我希望改进。

我最接近的是:

/(?=!next)[^$]/i

但实际上这只是匹配所有内容(现在我发现我错误地记住了^在字符类中的工作方式,所以这个解决方案无论如何都是垃圾。)

我搜索了网络,所以我完全被难倒了。

2 个答案:

答案 0 :(得分:4)

这是一个有趣的,使用正则表达式条件:

/(^)?!next(?(1)|$)/gm

Demo on Regex101

它的工作原理是它捕获行首锚,如果它不存在,则匹配行尾锚点。

但就个人而言,我仍然赞成你的解决方案而不是我的解决方案,因为对于那些对正则表达式没有非常全面了解(而且更便携)的人来说,它更具可读性。

为了增加乐趣,这是另一个版本(甚至比你最初的版本更丑):

/!next(?:(?<=^.{5})|(?=$))/gm

Demo on Regex101

但我仍然建议坚持使用经典的替代品。

最后,一个在JS中运行的(不,真的):

/(?:^|(?=.{5}$))!next/gm

Demo on Regex101

答案 1 :(得分:3)

你可以尝试

function beginningOrEnd(input, search) {
  const pos = input.search(search);
  return pos === 0 || pos === input.length - search.length;
}

beginningOrEnd("hey, !help", "!help");

这使用search.length,因此显然search必须是字符串。

或者,您可以自己构建正则表达式:

function beginningOrEnd(search) {
  return new RegExp(`^${search}|${search}\$`, "i");
}

beginningOrEnd("!help").test(input)

在现实世界中,你当然想要适当地逃避特殊的正则表达式字符。