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"

 

在javascript,报告看来那个"%a"未定义一个非常奇怪的行为,但它不是直接关系到这个问题,所以我开辟了一种全新的一段, 为什么是一个匹配的子字符串返回"未定义"? 。


问题是 console.log 接受的参数类似于 printf 语句,因为我正在记录( "%A" )的字符串,它试图寻找下一个参数的值。

时间:

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


var myString ="something format_abc";
var myRegexp =/(?:^|s)format_(.*?)(?:s|$)/g;
var match = myRegexp.exec(myString);
alert(match[1]);//abc

如果有多个匹配项,你可以对它们进行迭代:


match = myRegexp.exec(myString);
while (match!= null) {
//matched text: match[0]
//match start: match.index
//capturing group n: match[n]
 match = myRegexp.exec(myString);
}


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

var myString ="something format_abc";
var arr = myString.match(/bformat_(.*?)b/);
console.log(arr[0] +"" + arr[1]);

b 与( 工作于"--format_foo/",不工作于"format_a_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"]

关于上面的multi-match括号示例,在没有得到我想要的内容的情况下,我在这里寻找答案:


var matches = mystring.match(/(?:neededToMatchButNotWantedInResult)(matchWanted)/igm);

在查看了上面和. push() 上略微复杂的函数调用之后,我发现这个问题可以用 mystring.replace() 而不是( 替换不是重点,而且还没有完成,清除,内置的递归函数调用的第二个参数是) 优雅地解决: !


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

你的代码对于我有用( FF3上的) 即使我同意了 正规表达式 可能就应该:菲罗

 
/bformat_(.*?)b/

 

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

...