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

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

我想使用正则表达式匹配字符串的一部分,然后访问该带括号的子字符串:

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”未定义似乎是一种非常奇怪的行为,但它与此问题没有直接关系,所以我开了一个新的,为什么匹配的子字符串在JavaScript中返回“undefined”?


问题是console.log它的参数就像一个printf语句,因为我正在记录的字符串("%A")有一个特殊的值,它试图找到下一个参数的值。


qq_遁去的一_1
浏览 983回答 3
3回答

红糖糍粑

您可以像这样访问捕获组:var myString = "something format_abc";var myRegexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;var match = myRegexp.exec(myString);console.log(match[1]); // abc如果有多个匹配,您可以迭代它们:var myString = "something format_abc";var myRegexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;match = myRegexp.exec(myString);while (match != null) {  // matched text: match[0]  // match start: match.index  // capturing group n: match[n]  console.log(match[0])  match = myRegexp.exec(myString);}

至尊宝的传说

这是一种方法,您可以使用它来获得每个匹配的第n个捕获组:function getMatches(string, regex, index) {  index || (index = 1); // default to the first capturing group  var matches = [];  var match;  while (match = regex.exec(string)) {    matches.push(match[index]);  }  return matches;}// Example :var myString = 'something format_abc something format_def something format_ghi';var myRegEx = /(?:^|\s)format_(.*?)(?:\s|$)/g;// Get an array containing the first capturing group for every matchvar matches = getMatches(myString, myRegEx, 1);// Log resultsdocument.write(matches.length + ' matches found: ' + JSON.stringify(matches))console.log(matches);

弑天下

关于上面的多匹配括号示例,我在找不到我想要的内容之后在这里寻找答案:var matches = mystring.match(/(?:neededToMatchButNotWantedInResult)(matchWanted)/igm);在看了上面带有while和.push()的稍微复杂的函数调用之后,我突然意识到问题可以用mystring.replace()代替非常优雅(替换不是重点,甚至没有完成,CLEAN,第二个参数的内置递归函数调用选项是!):var yourstring = 'something format_abc something format_def something format_ghi';var matches = [];yourstring.replace(/format_([^\s]+)/igm, function(m, p1){ matches.push(p1); } );在此之后,我认为我不会再使用.match()了。
打开App,查看更多内容
随时随地看视频慕课网APP