[英]Return text between brackets and not include brackets
我正在使用以下 regEx 来匹配括号中的文本:
'textA(textB)'.match(/\((.+?)\)/g)
但它返回包含方括号的文本,例如 (textB)
如何返回不带括号的文本,例如 textB
我假设输入包含平衡括号。 如果是,则可以使用下面的正则表达式来匹配括号中出现的所有字符。
[^()]+(?=\))
> 'textA(textB)'.match(/[^()]+(?=\))/g)
[ 'textB' ]
说明:
[^()]+
否定的字符类,可匹配任何字符但不匹配(
或)
一次或多次。 (?=\\))
正向超前,它断言匹配的字符必须后跟右括号)
您必须在括号中用\\
引号将它们括起来\\
'textA(textB)'.match(/\((.+?)\)/g)
如果不这样做,则将外部括号解释为正则表达式元字符。
要提取不带括号的匹配文本:
var match = 'textA(textB)'.match(/\((.+?)\)/); // no "g"
var text = match[1];
创建一个与“ g”(“全局”)限定词一起使用的正则表达式以匹配并收集括号内的字符串是很.match()
,因为该限定词会导致.match()
函数的返回值发生变化。 如果不带“ g”,。 .match()
函数将返回一个数组,该数组的整体匹配项位于位置0,而匹配的组位于后续位置。 但是, 随着 “G”, .match()
简单地返回整个表达的所有比赛。
我能想到的唯一方法是重复进行匹配,而我认为最简单的方法是使用一个函数:
var parenthesized = [];
var text = "textA (textB) something (textC) textD) hello (last text) bye";
text.replace(/\((.+?)\)/g, function(_, contents) {
parenthesized.push(contents);
});
这将在数组中累积正确括号化的字符串“ textB”,“ textC”和“ last text”。 它不会包含“ textD”,因为它没有正确地加上括号。
可以定义一个将字符串与正则表达式匹配的函数,并通过用户定义的函数自定义输出数组。
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;
}
用户定义的函数随数组一起提供,该数组是RegExp.exec
的返回值。
用户定义的函数应返回一个值或值的数组。 它可以返回一个空数组,以从结果数组中排除当前匹配项的内容。
当未提供用户定义的函数fun
时,上述自定义函数的行为应与String.match
相同。 与滥用String.replace
提取数组相比,此方法的开销应较小,因为不必构造替换的字符串。
回到您的问题,使用上面的自定义函数,您可以将代码编写为:
'textA(textB)'.matchf(/\((.+?)\)/g, function (a) {return a[1];});
请matchAll
function。
(你原来的正则表达式就足够了)
for (const results of 'textA(textB)'.matchAll(/\((.+?)\)/g)) {
console.log(results[0]) // outputs: (textB)
console.log(results[1]) // outputs: textB
}
matchAll()
方法返回所有匹配字符串与正则表达式的结果的迭代器,包括捕获组; 索引 0 返回整体,并在返回组部分之后进行索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.