为了账号安全,请及时绑定邮箱和手机立即绑定

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

如何在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")有一个特殊的值,它试图找到下一个参数的值。
查看完整描述

3 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

您可以像这样访问捕获组:


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);

}


查看完整回答
反对 回复 2019-05-23
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

这是一种方法,您可以使用它来获得每个匹配的第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 match

var matches = getMatches(myString, myRegEx, 1);


// Log results

document.write(matches.length + ' matches found: ' + JSON.stringify(matches))

console.log(matches);


查看完整回答
反对 回复 2019-05-23
?
弑天下

TA贡献1818条经验 获得超7个赞

关于上面的多匹配括号示例,我在找不到我想要的内容之后在这里寻找答案:


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()了。


查看完整回答
反对 回复 2019-05-23
  • 3 回答
  • 0 关注
  • 944 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信