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/

 

( 當然,我不確定,因為我不知道 正規表達式的上下文。)

...