繁体   English   中英

返回括号之间的文本,不包括括号

[英]Return text between brackets and not include brackets

我正在使用以下 regEx 来匹配括号中的文本:

'textA(textB)'.match(/\((.+?)\)/g)

但它返回包含方括号的文本,例如 (textB)

如何返回不带括号的文本,例如 textB

我假设输入包含平衡括号。 如果是,则可以使用下面的正则表达式来匹配括号中出现的所有字符。

[^()]+(?=\))

DEMO

> '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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM