匹配最后出现的封闭外括号

时间:2015-04-26 01:49:30

标签: javascript regex

我现在尝试了三个小时来构建以下正则表达式匹配但没有取得多大成功。我有以下两个字符串:

This is a test string to illustrate the problem (example) in complex matching logic (Work / not working (in this case) to match this last occurring bracket closure)

Simpler version of the string (Matchable in any easy way)

我想定义一个匹配上面字符串最后一部分的str.match()。导致:

Work / not working (in this case) to match this last occurring bracket closure

Matchable in any easy way

实现这一目标的任何好方法?遗憾的是,数据非常不稳定,强大的正则表达式更受欢迎,而不是长期的功能逻辑。非常感谢!

4 个答案:

答案 0 :(得分:3)

您不能将任意深度嵌套的括号与正则表达式匹配。一些正则表达式引擎已经被扩展,它们可以解析那种语法,但是JavaScript没有;你需要手动匹配。

function lastParenthesizedSubstring(text) {
    var end = text.lastIndexOf(')');
    var i = end - 1;
    var nesting = 1;

    while (nesting > 0) {
        if (i < 0) {
            // Parenthesis imbalance! You may want to throw
            // an exception or something.
            return null;
        }

        var c = text.charAt(i);

        if (c === ')') {
            nesting++;
        } else if (c === '(') {
            nesting--;
        }

        i--;
    }

    return text.substring(i + 2, end);
}

答案 1 :(得分:1)

RegEx对此非常不切实际。你的正则表达式必须非常长,并且总是有它的局限性。我确实建议使用一些解析器。我喜欢使用balanced.js

var lastItem = balanced.matches({
    source: string,
    open: '(',
    close: ')'
}).map(function (match) {
    return string.substr(match.index + match.head.length, match.length - match.head.length - match.tail.length);
}).filter(function (a, b, c) {
    return b === c.length - 1;
})[0] || "";

<强> Fiddle

结果:

  

字符串的简单版本(以任何简单的方式匹配)

     

以任何简单的方式匹配

答案 2 :(得分:-1)

递归括号匹配(.NET样式)

\((?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\)

也会匹配&#34;(示例)&#34;在你的第一个字符串中。

答案 3 :(得分:-1)

无法想到更好的事情。这也不是100%RegEx。假设string是你的字符串

var matches = string.match(/(\([^(]*\))/g),
    result  = matches[matches.length-1].substring(0, matches[matches.length-1].length - 1);

限制

  • 仅允许一级深度括号
  • 只有一个,一个级别的深括号