0

の形式の文字列が与えられた場合、文字列"(a,{b:c,d:e,f:g},h})"から抽出したいと思いa,c,e,g,hます。つまり、文字列には常に3つのパラメータが含まれ、2番目のパラメータは次の形式に{b:c,d:e,f:g}なります。つまり、キーと値のペアが含まれ、それらはいくつでも存在できます。キーを残してすべての値を抽出したいと思います。

また、上記の文字列の1番目aと3番目のパラメータを抽出したいと思います。h文字列をスキャンして文字ベースで文字を抽出しようとしていますが、2番目の引数から値を抽出できません。

正規表現を使用してそれを行うための効率的な方法はありますか?

4

5 に答える 5

1

この正規表現を試してください:

\(([a-zA-Z0-9_\-]+),\{([a-zA-Z0-9_\-]+):([a-zA-Z0-9_\-]+),([a-zA-Z0-9_\-]+):([a-zA-Z0-9_\-]+),([a-zA-Z0-9_\-]+):([a-zA-Z0-9_\-]+)\},([a-zA-Z0-9_\-]+)\}\)

最初のグループはa、2番目はb、などです。

> str.match(/\(([a-zA-Z0-9_\-]+),\{([a-zA-Z0-9_\-]+):([a-zA-Z0-9_\-]+),([a-zA-Z0-9_\-]+):([a-zA-Z0-9_\-]+),([a-zA-Z0-9_\-]+):([a-zA-Z0-9_\-]+)\},([a-zA-Z0-9_\-]+)\}\)/)
["(a,{b:c,d:e,f:g},h})", "a", "b", "c", "d", "e", "f", "g", "h"]
于 2012-05-26T08:00:28.300 に答える
0

どうですか:

var testString = "(a,{b:c,d:e,f:g},h)";

var parameterArray = testString.split(/\((.+?),\{.+?:(.+?),.+?:(.+?),.+?:(.+?)\},(.+?)\)/);

これは、サンプル文字列の最後の が o 型であることを前提としてい})ますが、そうでない場合は簡単に変更できます。

于 2012-05-26T08:30:12.903 に答える
0

Divide and conquer!

function extract (str) {
  str = str.trim ().split (/\s*,\s*/); // split on , chars with optional surrounding spaces
  return str.map (function (v) { // create array from values
    // remove prefix and/or suffix from required values :
    // first ignore any leading ( or { chars
    // then ignore a single word followed by :
    // use the following trimmed string as the data
    // ignore any ) or } at the end  
    return (v.match (/^[({]*(?:\w\s*:\s*)?\s*(.*?)\s*[)}]*$/) || ['', v]) [1];
  });
}

This assumes that the data strings will never :

  1. be blank
  2. contain , characters
  3. begin with ( or {
  4. end with ) or }
于 2012-05-26T09:14:45.297 に答える
0

あなたが説明したように文字列の形式がわかっている場合、最初に文字列を編集してJSONにしてから使用しますeval

例:

var str1 = "('word1',{b:'word2',d:'word3',f:'word4'},'word5')";

// Edit the string to JSON format by replacing '(' and ')' with '[' and ']'
var str2 = str1.replace(/\(/, '[').replace(/\)/, ']')

// str2 is now => "['word1',{b:'word2',d:'word3',f:'word4'},'word5']"

var obj = eval(str2);

// All you results are now in obj.

var result1 = obj[0]; // This gets'word1'

//Similarly you can get the rest as follows:
obj[1].b // This gives you 'word2'
obj[1].d // 'word3'
obj[1].f // 'word4'
obj[2]   // 'word5'

obj[1]可変数のキー/値のペアがあり、値のみが必要な場合は、次のようにオブジェクトを反復処理できますobj[1]

for (var key in obj[1]) {
  obj[1][key];  // This gives the values in each iteration
}
于 2012-05-26T12:27:22.313 に答える
0

汎用split関数を使用した複雑なソリューションを次に示します。

var str = "(a,{b:c,d:e,f:g},h)"
var outstr = "";

var parts = str.split(",");
for (var ixPart = 0; ixPart < parts.length; ++ixPart) {
    if (ixPart > 0) outstr += ",";
    var part = parts[ixPart];
    if (part.indexOf(":") > 0) {
        var parts2 = parts[ixPart].split(":");
        var part2 = parts2[1];
        if (part2.indexOf("}") >= 0)
           outstr += part2.substring(0, part2.indexOf("}"));
        else outstr += part2;
    } else {
       if (part.indexOf("(") == 0) outstr += part.substring(1);
       else if (part.indexOf(")") >= 0)
           outstr += part.substring(0, part.indexOf(")"));
       else outstr += part;
    }
}

return outstr;
于 2012-05-26T08:15:21.840 に答える