Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中强制regexp不分割匹配?_Javascript_Regex - Fatal编程技术网

如何在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)");