0

match[input[name="firstname"]]取得する文字にさらに多くの括弧が含まれている可能性があることを考慮して、文字列内の最初の開き括弧と最後の閉じ括弧の間の文字を抽出したいと思います。またinput[name="firstname"]、文字列には次のような特殊文字が含まれる場合があります{ # / \ ^

4

2 に答える 2

3

このどこかぎこちない正規表現

/[^[\]]+\[[^[\]]+\]/

基本的には、「括弧なし、[、括弧なし、]」と言います。

s = 'match[input[name="firstname"]]'
> "match[input[name="firstname"]]"
re = /[^[\]]+\[[^[\]]+\]/
> /[^[\]]+\[[^[\]]+\]/
s.match(re)
> ["input[name="firstname"]"]

これをもう少し便利にするために、ネストに関して文字列から一番上のブラケットのコンテンツを抽出する方法を次に示します。

function extractTopmostBrackets(text) {
    var buf = '', all = [], depth = 0;
    text.match(/\]|\[|[^[\]]+/g).forEach(function(x) {
        if(x == '[')
            depth++;
        if(depth > 0)
            buf += x;
        if(x == ']')
            depth--;
        if(!depth && buf)
            all.push(buf), buf = '';
    })
    return all;
}

text = "foo [ begin [bar [baz] [spam]] end ] stuff [one [more]]"

console.log(extractTopmostBrackets(text))
// ["[ begin [bar [baz] [spam]] end ]", "[one [more]]"]

正規表現エンジンでの再帰一致のサポートにより、それを 1 行で記述できますが、javascript re はそれほど高度ではありません。

于 2013-01-26T12:25:23.933 に答える
1

これは、間にどの文字が含まれていても、文字列の最初の出現[と最後の出現の間のすべてに一致します。]

> s = 'match[input[name="firstname"]]'
"match[input[name="firstname"]]"
> re = /\[(.*)\]/
/\[(.*)\]/
> q = s.match(re)
["[input[name="firstname"]]", "input[name="firstname"]"]
> q[1]
"input[name="firstname"]"
于 2013-01-26T12:31:41.053 に答える