如何在JavaScript正则表达式中访问匹配的组?

如何在JavaScript正则表达式中访问匹配的组?,javascript,regex,Javascript,Regex,我想使用匹配符匹配字符串的一部分,然后访问带括号的子字符串: var myString = "something format_abc"; // I want "abc" var arr = /(?:^|\s)format_(.*?)(?:\s|$)/.exec(myString); console.log(arr); // Prints: [" format_abc", "abc"] .. so far so good. console.log(arr[1]); // Print

我想使用匹配符匹配字符串的一部分,然后访问带括号的子字符串:

var myString = "something format_abc"; // I want "abc"

var arr = /(?:^|\s)format_(.*?)(?:\s|$)/.exec(myString);

console.log(arr);     // Prints: [" format_abc", "abc"] .. so far so good.
console.log(arr[1]);  // Prints: undefined  (???)
console.log(arr[0]);  // Prints: format_undefined (!!!)
我做错了什么


我发现上面的正则表达式代码没有问题:我测试的实际字符串是:

"date format_%A"
报告“%A”未定义似乎是一种非常奇怪的行为,但它与这个问题没有直接关系,所以我打开了一个新的



问题是,
console.log
像一个
printf
语句一样获取其参数,并且由于我正在记录的字符串(
%a“
)有一个特殊的值,它试图找到下一个参数的值。

您可以访问如下捕获组:

{
    match: '...',
    matchAtIndex: 0,
    capturedGroups: [ '...', '...' ]
}
var myString=“something format\u abc”;
var myRegexp=/(?:^ |\s)格式(.*)(:\s |$)/g;
var match=myRegexp.exec(myString);
console.log(匹配[1]);//abc
使用您的代码:

console.log(arr[1]);  // prints: abc
console.log(arr[0]);  // prints:  format_abc
编辑:Safari 3,如果重要的话。

var myString=“something format\u abc”;
var arr=myString.match(/\bformat_U8;(.*?\b/);
console.log(arr[0]+“”+arr[1])即使我同意正则表达式应该是:

/\bformat_(.*?)\b/

(当然,我不确定,因为我不知道正则表达式的上下文。)

您的语法可能不是最好的。FF/Gecko将RegExp定义为函数的扩展。
(FF2一直到
typeof(/pattern/)=“function”

这似乎是FF特有的——IE、Opera和Chrome都会抛出例外

相反,请使用其他人之前提到的任何一种方法:
RegExp#exec
String#match

它们提供了相同的结果:

var regex = /(?:^|\s)format_(.*?)(?:\s|$)/;
var input = "something format_abc";

regex(input);        //=> [" format_abc", "abc"]
regex.exec(input);   //=> [" format_abc", "abc"]
input.match(regex);  //=> [" format_abc", "abc"]

这里有一个方法可以用来得到n​每场比赛的第四组:

函数getMatches(字符串、正则表达式、索引){ index | |(index=1);//默认为第一个捕获组 var匹配=[]; var匹配; while(match=regex.exec(字符串)){ matches.push(匹配[索引]); } 返回比赛; } //例如: var myString='something format_abc something format_def something format_ghi'; var myRegEx=/(?:^ |\s)格式(.*)(:\s |$)/g; //获取包含每个匹配的第一个捕获组的数组 var matches=getMatches(myString,myRegEx,1); //日志结果 document.write(matches.length+'找到匹配项:'+JSON.stringify(匹配项))
console.log(匹配项)仅当您有一对括号时才实用的一行程序:

while ( ( match = myRegex.exec( myStr ) ) && matches.push( match[1] ) ) {};

关于上面的多匹配圆括号示例,在没有得到我想要的答案后,我在这里寻找答案:

var matches = mystring.match(/(?:neededToMatchButNotWantedInResult)(matchWanted)/igm);
在查看了上面使用while和.push()进行的稍微复杂的函数调用之后,我突然意识到,使用mystring.replace()可以非常优雅地解决这个问题(替换不是重点,甚至没有完成,第二个参数的干净的内置递归函数调用选项是!):

在这之后,我想我再也不会对任何东西使用.match()。

/*Regex function for extracting object from "window.location.search" string.
 */

var search = "?a=3&b=4&c=7"; // Example search string

var getSearchObj = function (searchString) {

    var match, key, value, obj = {};
    var pattern = /(\w+)=(\w+)/g;
    var search = searchString.substr(1); // Remove '?'

    while (match = pattern.exec(search)) {
        obj[match[0].split('=')[0]] = match[0].split('=')[1];
    }

    return obj;

};

console.log(getSearchObj(search));
函数getMatches(字符串、正则表达式、索引){ index | |(index=1);//默认为第一个捕获组 var匹配=[]; var匹配; while(match=regex.exec(字符串)){ matches.push(匹配[索引]); } 返回比赛; } //例如: var myString='Rs.200记入ATM机2031年2月12日20:05:49(结清余额Rs.66248.77)的账户借方。收费站1800223344 18001024455(上午6时至晚上10时); var myRegEx=/clear bal.+?(\d+\.?\d{2})/gi; //获取包含每个匹配的第一个捕获组的数组 var matches=getMatches(myString,myRegEx,1); //日志结果 document.write(matches.length+'找到匹配项:'+JSON.stringify(匹配项))
console.log(匹配项)最后但并非最不重要的一点是,我发现有一行代码对我来说运行良好(JS ES6):

let reg=/#([\S]+)/igm;//获取hashtags。

让string='mi alegría es total!✌ 无需调用
exec
方法!您可以直接在字符串上使用“match”方法。别忘了括号

var str = "This is cool";
var matches = str.match(/(This is)( cool)$/);
console.log( JSON.stringify(matches) ); // will print ["This is cool","This is"," cool"] or something like that...
位置0有一个包含所有结果的字符串。位置1的第一个匹配项用括号表示,位置2的第二个匹配项用括号隔开。嵌套的括号很棘手,所以要小心

本答复中使用的术语:
  • Match指示对字符串运行正则表达式模式的结果,如下所示:
    someString.Match(regexpatern)
  • 匹配模式表示输入字符串的所有匹配部分,它们都位于匹配数组中。这些都是输入字符串中模式的实例
  • 匹配组表示要捕获的所有组,在正则表达式模式中定义。(括号内的模式,如:
    /format.(.*?)/g
    ,其中
    (.*?
    将是一个匹配的组。)这些模式位于匹配的模式中
描述 要访问匹配的组,在每个匹配的模式中,您需要一个函数或类似的东西来迭代匹配。正如许多其他答案所示,有很多方法可以做到这一点。大多数其他答案使用while循环来迭代所有匹配的模式,但我认为我们都知道这种方法的潜在危险。有必要与
new RegExp()
匹配,而不仅仅是模式本身,它只在注释中提到。这是因为
.exec()

代码示例 下面是一个函数
searchString
的示例,该函数返回所有匹配模式的
Array
,其中每个
match
都是包含所有匹配组的
数组。Ins
const url =
  'https://stackoverflow.com/questions/432493/how-do-you-access-the-matched-groups-in-a-javascript-regular-expression?some=parameter';
const regex = /(?<protocol>https?):\/\/(?<hostname>[\w-\.]*)\/(?<pathname>[\w-\./]+)\??(?<querystring>.*?)?$/;
const { groups: segments } = url.match(regex);
console.log(segments);
/([a-z])\1/
{
    match: '...',
    matchAtIndex: 0,
    capturedGroups: [ '...', '...' ]
}
const matches = (text,regex) => [...text.matchAll(regex)].map(([match])=>match)
matches("something format_abc", /(?:^|\s)format_(.*?)(?:\s|$)/g)
[" format_abc"]