我有这个代码:
id = selectors[s].match(new RegExp( "(^|\\s" + regexes.ids + "\\s|$)", 'gm'));
生成的正则表达式:
/(^|\s(#sidebar-right-1|#BlogArchive1|#ArchiveList|#BlogArchive1_ArchiveList|#PopularPosts)\s|$)/gm
问题是,当选择器[s]确实包含我正在寻找的id时,它会返回像[“”,“”]这样的匹配,这不是我想要的。你能告诉我如何强制它不分割结果吗?我的意思是 - 当我查找 (wordA(wordB)wordC)
并且 wordB 不在字符串中时,则不应返回任何结果或仅返回一个值为 null 的结果。如果所有单词 B 都存在,但缺少 wordA 或 wordB,则还应返回 null 或一个包含 null 的元素。
可以吗?我习惯在 PHP 中执行此操作,但 Javascript 算法似乎略有不同。
编辑:
我也尝试过
/^|s(#sidebar-right-1|#BlogArchive1|#ArchiveList|#BlogArchive1_ArchiveList|#PopularPosts)s|$|{/gm
之前
最佳答案
有几个问题:
- 首先,当您想要在 RegExp 构造函数的带引号的字符串中计算反斜杠时,需要将其转义。
- 您想要将一个交替与多个部分连接起来以分隔项目。在这种情况下,要将“边界”纳入交替因素中,您需要将交替放入一个组中。
- 最后,Javascript 支持前瞻,因此您可以将
(\s|$)
替换为(?!\S)
。这样做可以避免创建一个组并无缘无故地测试一个替换,但主要优点是您的模式能够匹配仅由一个空格分隔的多个出现情况。
结果:
new RegExp("(^|\\s)(" + regexes.ids + ")(?!\\S)");
另一件事,你的所有项目都以#
开头,最好将其考虑在内以更快地失败(而不是在没有尖号的位置测试每个项目):
new RegExp("(^|\\s)(#(?:" + regexes_without_sharp.ids + "))(?!\\S)");
关于javascript - 如何强制正则表达式不分割 JavaScript 中的匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39310562/