如何强制regexp不在Javascript中拆分匹配?

时间:2016-09-03 19:22:30

标签: javascript regex

我有这段代码:

id = selectors[s].match(new RegExp( "(^|\\s" + regexes.ids + "\\s|$)", 'gm'));

结果正则表达式:

/(^|\s(#sidebar-right-1|#BlogArchive1|#ArchiveList|#BlogArchive1_ArchiveList|#PopularPosts)\s|$)/gm

问题是,当selectors [s]确实包含我正在寻找的id时,它会返回类似[“”,“”]的匹配,这不是我想要的。你能告诉我如何强迫它不要分割结果吗?我的意思是 - 当我在寻找(wordA(wordB)wordC)并且字母不在字符串中时,则不应返回任何结果或仅返回一个null结果。如果所有单词B都存在但缺少wordA或wordB,则它也应该返回null或一个带null的元素。

有可能吗?我曾经习惯在PHP中这样做,但Javascript算法似乎略有不同。

编辑:

我也试过

/^|s(#sidebar-right-1|#BlogArchive1|#ArchiveList|#BlogArchive1_ArchiveList|#PopularPosts)s|$|{/gm之前

2 个答案:

答案 0 :(得分:1)

OR(|)操作使得您也可以仅匹配 字符串的结尾,该字符串为空。相反,您可能希望$只是 替代\s,而不是整个表达式。所以你应该将最后的|隔离开来(在开始时也是如此,因为^上面也是如此):

"(^|\\s)(" + regexes.ids + ")(\\s|$)"

注意开始和结束时的结束和重新打开括号。

答案 1 :(得分:1)

有几个问题:

  • 首先,当你想在RegExp构造函数的引用字符串中找到反斜杠时,你需要将其转义。
  • 您想要连接部件的交替以分隔该项目。在这种情况下,要将“边界”放在交替的因子中,您需要将交替放在一个组中。
  • 完成后,Javascript支持前瞻,因此您可以将(\s|$)替换为(?!\S)。这样做可以避免创建一个组并且无需测试交替,但主要优点是你的模式能够匹配由一个空格分隔的几个出现。

结果:

new RegExp("(^|\\s)(" + regexes.ids + ")(?!\\S)"); 

其他方面,您的所有商品都以#开头,最好将其设置为更快失败的因素(而不是在没有锐利的位置测试每个商品):

new RegExp("(^|\\s)(#(?:" + regexes_without_sharp.ids + "))(?!\\S)");