如何在Javascript中强制regexp不分割匹配?
我有以下代码:如何在Javascript中强制regexp不分割匹配?,javascript,regex,Javascript,Regex,我有以下代码: id = selectors[s].match(new RegExp( "(^|\\s" + regexes.ids + "\\s|$)", 'gm')); 生成的regexp: /(^ |\s(|侧栏-右-1 | |#BlogArchive1 |#ArchiveList |#BlogArchive1 | u ArchiveList |#PopularPosts)\s |$)/gm 问题是,当选择器[s]确实包含我要查找的id时,它会返回像[“”,“”]这样的匹配,这不是我想要
id = selectors[s].match(new RegExp( "(^|\\s" + regexes.ids + "\\s|$)", 'gm'));
生成的regexp:
/(^ |\s(|侧栏-右-1 | |#BlogArchive1 |#ArchiveList |#BlogArchive1 | u ArchiveList |#PopularPosts)\s |$)/gm
问题是,当选择器[s]确实包含我要查找的id时,它会返回像[“”,“”]这样的匹配,这不是我想要的。你能告诉我如何强制它不要分割结果吗?我的意思是-当我查找(wordA(wordB)wordC)
时,如果wordB不在字符串中,则不应返回任何结果,或者只返回一个带有null的结果。如果所有单词B都存在,但缺少wordA或wordB,则还应返回null或一个带有null的元素
有可能吗?我曾经在PHP中这样做过,但Javascript算法似乎略有不同
编辑:
我也试过了
/^ s(#侧边栏-右-1 |#BlogArchive1 |#ArchiveList | BlogArchive1 | u ArchiveList | | PopularPosts)s |$|{/gm操作使您也可以只匹配字符串的结尾,它是空的。相反,您可能希望$
只是\s
的一个替代项,而不是整个表达式。因此,您应该隔离最后一个|
(在开始时也是如此,因为上面对^
同样适用):
注意开始和结束处的结束括号和重新打开括号。或(|
)操作使您也可以只匹配字符串的结尾,它是空的。相反,您可能希望$
只是\s
的一个替代项,而不是整个表达式。因此,您应该隔离最后一个|
(在开始时也是如此,因为上面对^
同样适用):
请注意开始和结束处的关闭和重新打开括号。有几个问题:
- 首先,当您想要在带引号的字符串中为RegExp构造函数计算反斜杠时,需要对其进行转义
- 您希望将替换与部分连接起来以分隔项目。在这种情况下,要将“边界”与替换放在因子中,您需要将替换放在一个组中
- 最后,Javascript支持lookaheads,因此您可以用
(?!\s)
替换(\s |$)
。这样做可以避免创建一个组并测试一个替代项,但主要优点是您的模式能够匹配由一个空格分隔的多个事件
结果:
new RegExp("(^|\\s)(" + regexes.ids + ")(?!\\S)");
另外,您的所有项目都以#
开头,最好将其放入因子中,以便更快地失败(而不是在没有尖锐标记的位置测试每个项目):
有几个问题:
- 首先,当您想要在带引号的字符串中为RegExp构造函数计算反斜杠时,需要对其进行转义
- 您希望将替换与部分连接起来以分隔项目。在这种情况下,要将“边界”与替换放在因子中,您需要将替换放在一个组中
- 最后,Javascript支持lookaheads,因此您可以用
(?!\s)
替换(\s |$)
。这样做可以避免创建一个组并测试一个替代项,但主要优点是您的模式能够匹配由一个空格分隔的多个事件
结果:
new RegExp("(^|\\s)(" + regexes.ids + ")(?!\\S)");
另外,您的所有项目都以#
开头,最好将其放入因子中,以便更快地失败(而不是在没有尖锐标记的位置测试每个项目):
这个{
是如何进入你的最终正则表达式的?它不是你提供的原始正则表达式中的…我删除了它。我想手动将它添加到正则表达式中那|{
输入您的最终正则表达式?它不是您提供的原始正则表达式…我删除了它。我想手动将其添加到正则表达式中。谢谢。我也注意到生成“s”的错误。谢谢。我也注意到生成“s”的错误。
new RegExp("(^|\\s)(#(?:" + regexes_without_sharp.ids + "))(?!\\S)");