我使用以下regEx来匹配括号中的文字:
'textA(textB)'.match(/\((.+?)\)/g)
但它会返回包含括号的文字,例如(TEXTB)
如何在没有括号的情况下返回文本,例如TEXTB
答案 0 :(得分:1)
我假设输入包含平衡括号。如果是,那么您可以使用以下正则表达式来匹配括号内的所有字符。
[^()]+(?=\))
> 'textA(textB)'.match(/[^()]+(?=\))/g)
[ 'textB' ]
<强>解释强>
[^()]+
否定字符类,匹配任何字符,但不匹配(
或)
一次或多次。(?=\))
肯定前瞻,断言匹配的字符必须后跟右括号)
答案 1 :(得分:0)
您必须通过引用\
'textA(textB)'.match(/\((.+?)\)/g)
如果你不这样做,外括号被解释为正则表达式元字符。
要提取匹配的文本而不包含周围的括号:
var match = 'textA(textB)'.match(/\((.+?)\)/); // no "g"
var text = match[1];
创建一个适用于&#34; g&#34;的正则表达式很棘手。 (&#34; global&#34;)限定符匹配并收集括号内的字符串,因为该限定符会导致.match()
函数返回值发生更改。如果没有&#34; g&#34;,.match()
函数将返回一个数组,其中位置0的整体匹配和后续位置的匹配组。但是,使用&#34; g&#34;,.match()
只返回整个表达式的所有匹配项。
我能想到的唯一方法就是重复匹配,最简单的方法(在我看来)是有一个功能:
var parenthesized = [];
var text = "textA (textB) something (textC) textD) hello (last text) bye";
text.replace(/\((.+?)\)/g, function(_, contents) {
parenthesized.push(contents);
});
这将累积正确括号的字符串&#34; textB&#34;,&#34; textC&#34;和&#34; last text&#34;在数组中。它不包括&#34; textD&#34;因为它没有正确括号。
答案 2 :(得分:0)
可以定义一个函数,该函数将字符串与正则表达式匹配,并通过用户定义的函数自定义输出数组。
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
的返回值。
用户定义的函数应返回值或值数组。它可以返回一个空数组,以从结果数组中排除当前匹配的内容。
当未提供用户定义的函数String.match
时,上述自定义函数的行为应与fun
相同。与滥用String.replace
提取数组相比,这应该具有更少的开销,因为它不必构造替换的字符串。
回到您的问题,使用上面的自定义函数,您可以将代码编写为:
'textA(textB)'.matchf(/\((.+?)\)/g, function (a) {return a[1];});