问题

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

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")有一个特殊的值,它试图找到下一个参数的值.



解决方法

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

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




相关问题推荐