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(第二个捕获组)中找到匹配项 基本上,您有两种选择:
var matches = string.match(regex);
var id = matches[1] || matches[2];
不过,我会选择选项1。短版本:JavaScript。。。你不能 但是,让我们先了解一些术语:数组中的第一项是实际的匹配项。因为您的模式恰好与整个字符串匹配,所以您可以取回整个字符串。然后,每个捕获的组(模式中的括号)将获得一个项目 不幸的是,JavaScript的正则表达式支持非常有限。其他口味会让你很容易得到你想要的。例如:
- Perl/PCRE支持:
-此模式将返回单个捕获组(?|vu\?pi=(.*)|.-(\d*)
- .NET支持重复的命名组:
-此模式将在(?:vu\?pi=(?.*)|.-(?\d*)
组中返回单个值id
var match = /your regex/.exec(yourString);
var value = match && (match[1] || match[2]);
作为旁注,我会像这样重写您的模式:
/^(?:https?:\/\/)?[^\/]*?brainshark.*\/(?:vu\b.*?[?&]pi=([^&]*)|.*-(\d*))/i
我使用了
[^&]*
和[?&]
来表示何时会遇到包含更多查询参数的URL。开头的更改是确保主机名中有brainshark
字符串。哦,我还添加了不区分大小写的功能。只是想知道为什么需要将所有逻辑放在一个regexp中?为什么不使用正常的if语句或其他什么?:)