Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 如何让我的正则表达式只返回我的匹配项?_Javascript_Regex - Fatal编程技术网

Javascript 如何让我的正则表达式只返回我的匹配项?

Javascript 如何让我的正则表达式只返回我的匹配项?,javascript,regex,Javascript,Regex,我正在这样做: var regex = /^.*brainshark.*\/(?:vu\?pi=(.*)|.*-(\d*))/; string.match(regex).exec() 假设字符串与正则表达式完全匹配,我得到一个三个数组。第一个元素包含整个字符串。第二个元素可能包含也可能不包含匹配项,而我的第三个元素可能包含也可能不包含匹配项 假设我的字符串为“” 我的比赛将在索引2上 如果字符串为“”,则匹配项将位于索引1上 我怎样才能得到它,使我的匹配总是在元素1中,或者可能的话,我只是在

我正在这样做:

var regex = /^.*brainshark.*\/(?:vu\?pi=(.*)|.*-(\d*))/;

string.match(regex).exec()
假设字符串与正则表达式完全匹配,我得到一个三个数组。第一个元素包含整个字符串。第二个元素可能包含也可能不包含匹配项,而我的第三个元素可能包含也可能不包含匹配项

假设我的字符串为“” 我的比赛将在索引2上

如果字符串为“”,则匹配项将位于索引1上


我怎样才能得到它,使我的匹配总是在元素1中,或者可能的话,我只是在没有任何数组的情况下返回匹配?

您在一个不重复的替换中定义了两个捕获组。因此,两个捕获组中的任何一个都可以匹配一个子串,但不能同时匹配两个子串。这解释了为什么有时会在索引1(第一个捕获组)和索引2(第二个捕获组)中找到匹配项

基本上,您有两种选择:

  • 重写你的正则表达式,这样在交替中只有一个捕获组
  • 将文本与现有表达式匹配,并从两个捕获的值中选择一个
  • 编写两个更简单的表达式,检查第一个表达式是否匹配,如果不匹配,则执行第二个表达式
  • 下面是选项2的外观:

    var matches = string.match(regex);
    var id = matches[1] || matches[2];
    

    不过,我会选择选项1。

    短版本:JavaScript。。。你不能

    但是,让我们先了解一些术语:数组中的第一项是实际的匹配项。因为您的模式恰好与整个字符串匹配,所以您可以取回整个字符串。然后,每个捕获的组(模式中的括号)将获得一个项目

    不幸的是,JavaScript的正则表达式支持非常有限。其他口味会让你很容易得到你想要的。例如:

    • Perl/PCRE支持:
      (?|vu\?pi=(.*)|.-(\d*)
      -此模式将返回单个捕获组
    • .NET支持重复的命名组:
      (?:vu\?pi=(?.*)|.-(?\d*)
      -此模式将在
      id
      组中返回单个值
    但在JS中,您基本上必须自己提取您的价值。一个简单的解决办法是:

    var match = /your regex/.exec(yourString);
    var value = match && (match[1] || match[2]);
    

    作为旁注,我会像这样重写您的模式:

    /^(?:https?:\/\/)?[^\/]*?brainshark.*\/(?:vu\b.*?[?&]pi=([^&]*)|.*-(\d*))/i
    

    我使用了
    [^&]*
    [?&]
    来表示何时会遇到包含更多查询参数的URL。开头的更改是确保主机名中有
    brainshark
    字符串。哦,我还添加了不区分大小写的功能。

    只是想知道为什么需要将所有逻辑放在一个regexp中?为什么不使用正常的if语句或其他什么?:)