在括号之间返回文本而不包括括号

时间:2014-11-02 13:29:58

标签: javascript regex

我使用以下regEx来匹配括号中的文字:

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

但它会返回包含括号的文字,例如(TEXTB)

如何在没有括号的情况下返回文本,例如TEXTB

3 个答案:

答案 0 :(得分:1)

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

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

DEMO

> '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];});