如何在JavaScript正则表达式中访问匹配的组?
我想使用匹配符匹配字符串的一部分,然后访问带括号的子字符串:如何在JavaScript正则表达式中访问匹配的组?,javascript,regex,Javascript,Regex,我想使用匹配符匹配字符串的一部分,然后访问带括号的子字符串: 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]); // Print
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”未定义似乎是一种非常奇怪的行为,但它与这个问题没有直接关系,所以我打开了一个新的
问题是,
console.log
像一个printf
语句一样获取其参数,并且由于我正在记录的字符串(%a“
)有一个特殊的值,它试图找到下一个参数的值。您可以访问如下捕获组:
{
match: '...',
matchAtIndex: 0,
capturedGroups: [ '...', '...' ]
}
var myString=“something format\u abc”;
var myRegexp=/(?:^ |\s)格式(.*)(:\s |$)/g;
var match=myRegexp.exec(myString);
console.log(匹配[1]);//abc
使用您的代码:
console.log(arr[1]); // prints: abc
console.log(arr[0]); // prints: format_abc
编辑:Safari 3,如果重要的话。
var myString=“something format\u abc”;
var arr=myString.match(/\bformat_U8;(.*?\b/);
console.log(arr[0]+“”+arr[1])代码>即使我同意正则表达式应该是:
/\bformat_(.*?)\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"]
这里有一个方法可以用来得到n每场比赛的第四组:
函数getMatches(字符串、正则表达式、索引){
index | |(index=1);//默认为第一个捕获组
var匹配=[];
var匹配;
while(match=regex.exec(字符串)){
matches.push(匹配[索引]);
}
返回比赛;
}
//例如:
var myString='something format_abc something format_def something format_ghi';
var myRegEx=/(?:^ |\s)格式(.*)(:\s |$)/g;
//获取包含每个匹配的第一个捕获组的数组
var matches=getMatches(myString,myRegEx,1);
//日志结果
document.write(matches.length+'找到匹配项:'+JSON.stringify(匹配项))
console.log(匹配项)代码>仅当您有一对括号时才实用的一行程序:
while ( ( match = myRegex.exec( myStr ) ) && matches.push( match[1] ) ) {};
关于上面的多匹配圆括号示例,在没有得到我想要的答案后,我在这里寻找答案:
var matches = mystring.match(/(?:neededToMatchButNotWantedInResult)(matchWanted)/igm);
在查看了上面使用while和.push()进行的稍微复杂的函数调用之后,我突然意识到,使用mystring.replace()可以非常优雅地解决这个问题(替换不是重点,甚至没有完成,第二个参数的干净的内置递归函数调用选项是!):
在这之后,我想我再也不会对任何东西使用.match()。
/*Regex function for extracting object from "window.location.search" string.
*/
var search = "?a=3&b=4&c=7"; // Example search string
var getSearchObj = function (searchString) {
var match, key, value, obj = {};
var pattern = /(\w+)=(\w+)/g;
var search = searchString.substr(1); // Remove '?'
while (match = pattern.exec(search)) {
obj[match[0].split('=')[0]] = match[0].split('=')[1];
}
return obj;
};
console.log(getSearchObj(search));
函数getMatches(字符串、正则表达式、索引){
index | |(index=1);//默认为第一个捕获组
var匹配=[];
var匹配;
while(match=regex.exec(字符串)){
matches.push(匹配[索引]);
}
返回比赛;
}
//例如:
var myString='Rs.200记入ATM机2031年2月12日20:05:49(结清余额Rs.66248.77)的账户借方。收费站1800223344 18001024455(上午6时至晚上10时);
var myRegEx=/clear bal.+?(\d+\.?\d{2})/gi;
//获取包含每个匹配的第一个捕获组的数组
var matches=getMatches(myString,myRegEx,1);
//日志结果
document.write(matches.length+'找到匹配项:'+JSON.stringify(匹配项))
console.log(匹配项)代码>最后但并非最不重要的一点是,我发现有一行代码对我来说运行良好(JS ES6):
let reg=/#([\S]+)/igm;//获取hashtags。
让string='mi alegría es total!✌ 无需调用exec
方法!您可以直接在字符串上使用“match”方法。别忘了括号
var str = "This is cool";
var matches = str.match(/(This is)( cool)$/);
console.log( JSON.stringify(matches) ); // will print ["This is cool","This is"," cool"] or something like that...
位置0有一个包含所有结果的字符串。位置1的第一个匹配项用括号表示,位置2的第二个匹配项用括号隔开。嵌套的括号很棘手,所以要小心 本答复中使用的术语:
- Match指示对字符串运行正则表达式模式的结果,如下所示:
someString.Match(regexpatern)
- 匹配模式表示输入字符串的所有匹配部分,它们都位于匹配数组中。这些都是输入字符串中模式的实例
- 匹配组表示要捕获的所有组,在正则表达式模式中定义。(括号内的模式,如:
/format.(.*?)/g
,其中(.*?
将是一个匹配的组。)这些模式位于匹配的模式中
描述
要访问匹配的组,在每个匹配的模式中,您需要一个函数或类似的东西来迭代匹配。正如许多其他答案所示,有很多方法可以做到这一点。大多数其他答案使用while循环来迭代所有匹配的模式,但我认为我们都知道这种方法的潜在危险。有必要与new RegExp()
匹配,而不仅仅是模式本身,它只在注释中提到。这是因为.exec()
代码示例
下面是一个函数searchString
的示例,该函数返回所有匹配模式的Array
,其中每个match
都是包含所有匹配组的数组。Ins
const url =
'https://stackoverflow.com/questions/432493/how-do-you-access-the-matched-groups-in-a-javascript-regular-expression?some=parameter';
const regex = /(?<protocol>https?):\/\/(?<hostname>[\w-\.]*)\/(?<pathname>[\w-\./]+)\??(?<querystring>.*?)?$/;
const { groups: segments } = url.match(regex);
console.log(segments);
/([a-z])\1/
{
match: '...',
matchAtIndex: 0,
capturedGroups: [ '...', '...' ]
}
const matches = (text,regex) => [...text.matchAll(regex)].map(([match])=>match)
matches("something format_abc", /(?:^|\s)format_(.*?)(?:\s|$)/g)
[" format_abc"]