String.prototype.matchf = function (re, fun) {
if (re == null || re.constructor != RegExp) {
re = new RegExp(re);
}
// Use default behavior of String.prototype.match for non-global regex.
if (!re.global) {
return this.match(re);
}
if (fun == null) { // null or undefined
fun = function (a) { return a[0]; };
}
if (typeof fun != "function") {
throw TypeError(fun + " is not a function");
}
// Reset lastIndex
re.lastIndex = 0;
var a;
var o = [];
while ((a = re.exec(this)) != null) {
o = o.concat(fun(a));
}
if (o.length == 0) {
o = null;
}
return o;
}
4条答案
按热度按时间zbq4xfa01#
我假设输入包含了对称括号,如果是,那么你可以使用下面的正则表达式来匹配括号中的所有字符。
DEMO
[^()]+
求反字符类,匹配任何字符,但不匹配(
或)
一次或多次。(?=\))
正向前查找,它Assert匹配的字符后面必须跟右括号)
ql3eal8s2#
您必须在正则表达式中显式地包括圆括号,方法是用
\
将它们引起来如果不这样做,外括号将被解释为正则表达式元字符。
要提取不带圆括号的匹配文本:
创建一个使用“g”的正则表达式是很棘手的(“global”)限定符来匹配和收集圆括号内的字符串,因为该限定符会导致
.match()
函数返回值发生更改。如果没有“g”,.match()
函数将返回一个数组,其中总体匹配项位于位置0,匹配组位于后续位置。但是,with the“g”,.match()
只返回整个表达式的所有匹配项。我能想到的唯一方法是重复匹配,而最简单的方法(在我看来)是使用函数:
这将把正确括起来的字符串“textB”、“textC”和“last text”累加到数组中。它将不包括“textD”,因为它没有正确括起来。
sbdsn5lh3#
可以定义一个函数来匹配正则表达式中的字符串,并通过用户定义函数定制输出数组。
用户定义函数提供了一个数组,该数组是
RegExp.exec
的返回值。用户定义函数应返回一个值或一个值数组。它可以返回一个空数组以从结果数组中排除当前匹配项的内容。
当没有提供用户定义函数
fun
时,上述自定义函数的行为应该与String.match
相同,与滥用String.replace
来提取数组相比,这应该具有更少的开销,因为它不必构造替换的字符串。回到您的问题,使用上面的自定义函数,您可以将代码编写为:
ujv3wf0j4#
请改用
matchAll
函数。(your原始的正则表达式就足够了)
matchAll()
方法返回一个迭代器,该迭代器包含与正则表达式匹配的所有结果,包括捕获组;index 0返回整体,index after返回组部分。