javascript - 如何强制正则表达式不分割 JavaScript 中的匹配项?

标签 javascript regex

我有这个代码:

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/

相关文章:

java - 正则表达式在之前或之后匹配字符串,并且每组仅返回一个匹配项

javascript - 如何在 Famo.us 中的表面之间滑动?

javascript - 使用来自 Browserify 和 Typescript 的源映射进行 Webstorm 调试

javascript - 静态路径内的主干?无论如何到 window.location + '#' ?

regex - 如何使用量词访问括号中的捕获缓冲区?

java - 正则表达式掩盖电话号码

java - Java 中的正则表达式分组

c# - 正则表达式或不匹配

javascript - 无法获取 DOM 元素样式

javascript - 如何在 1 次后停止 gif react-native?