我有这段代码:
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
之前
答案 0 :(得分:1)
OR(|
)操作使得您也可以仅匹配 字符串的结尾,该字符串为空。相反,您可能希望$
只是 替代\s
,而不是整个表达式。所以你应该将最后的|
隔离开来(在开始时也是如此,因为^
上面也是如此):
"(^|\\s)(" + regexes.ids + ")(\\s|$)"
注意开始和结束时的结束和重新打开括号。
答案 1 :(得分:1)
有几个问题:
(\s|$)
替换为(?!\S)
。这样做可以避免创建一个组并且无需测试交替,但主要优点是你的模式能够匹配由一个空格分隔的几个出现。结果:
new RegExp("(^|\\s)(" + regexes.ids + ")(?!\\S)");
其他方面,您的所有商品都以#
开头,最好将其设置为更快失败的因素(而不是在没有锐利的位置测试每个商品):
new RegExp("(^|\\s)(#(?:" + regexes_without_sharp.ids + "))(?!\\S)");