匹配所有的 []包括里面的内容
var aa = '123[12123][asd][asdas]123[!@3asd234]';
alert(aa.match(/\[([^\]]*?)]/g));
想这种不带嵌套的肯定是没什么问题的
但是遇到这种情况就会出差错啦var aa = '12[3[12123]ghgjh][asd][asdas]123[!@3asd234]';
alert(aa.match(/\[([^\]]*?)]/g));如果匹配出嵌套的情况了.....

解决方案 »

  1.   


    <script type="text/javascript">
    var matchRecursive = function () {
    var formatParts = /^([\S\s]+?)\.\.\.([\S\s]+)/,
    metaChar = /[-[\]{}()*+?.\\^$|,]/g,
    escape = function (str) {
    return str.replace(metaChar, "\\$&");
    }; return function (str, format) {
    var p = formatParts.exec(format);
    if (!p) throw new Error("format must include start and end tokens separated by '...'");
    if (p[1] == p[2]) throw new Error("start and end format tokens cannot be identical"); var opener = p[1],
    closer = p[2],
    iterator = new RegExp(format.length == 5 ? "["+escape(opener+closer)+"]" : escape(opener)+"|"+escape(closer), "g"),
    results = [],
    openTokens, matchStartIndex, match; do {
    openTokens = 0;
    while (match = iterator.exec(str)) {
    if (match[0] == opener) {
    if (!openTokens)
    matchStartIndex = iterator.lastIndex;
    openTokens++;
    } else if (openTokens) {
    openTokens--;
    if (!openTokens)
    results.push(str.slice(matchStartIndex, match.index));
    }
    }
    } while (openTokens && (iterator.lastIndex = matchStartIndex)); return results;
    };
    }();
    console.log(matchRecursive("12[3[12123]ghgjh][asd][asdas]123[!@3asd234]", "[...]")); //  ["3[12123]ghgjh", "asd", "asdas", "!@3asd234"]
    </script>
      

  2.   

    如果你用 后台的正则,比如c#的正则匹配,可以用:
    /\[[^\[\]]*(((?'open'\[)[^\[\]]*)+((?'-open'\])[^\[\]]*)+)*(?(open)(?!))\]/g
    JS的正则有太多的不支持,还有待考虑