1

私はこのようなものを持っています

{{ a_name a_description:"a value" another_description: "another_value" }}

a_nameすべての説明と値を一致させたい。

私が現在使用している正規表現は

{{\s*(?<function>\w+)\s+((?<attr>\w+)\s*\:\s*\"(?<val>\w+?)\"\s*)+}}

しかし、それは最後のグループにのみ一致します。どうすればすべてのグループに一致させることができますか? 関連する場合は JavaScript を使用しています。

4

3 に答える 3

0

これは2つの部分で行う必要があります。最初に名前を取得し、次に説明と値のペアを取得します。

str = '{{ a_name a_description:"a value" another_description: "another_value" }}';
name = /\w+/.exec(str);

// notice the '?' at the end to make it non-greedy.
re = /(?:(\w+):\s*"([^"]+)"\s*)+?/g;
var res;
while ((res = re.exec(str)) !=null) {
    // For each iteration, description = res[1]; value = res[2];
}

ETA:1つの正規表現でそれを行うことができますが、それは物事を複雑にします:

re = /(?:{{\s*([^ ]+) )|(?:(\w+):\s*"([^"]+)"\s*)+?/g;
while ((res = re.exec(str)) !=null) {
    if (!name) {
        name = res[1];
    }
    else {
        description = res[2];
        value = res[3];
    }
}
于 2012-06-20T12:49:11.260 に答える
0

JavaScript の場合:

var re = /{{ (\w+) (\w+):\"([a-zA-Z_ ]+)\" (\w+): \"([a-zA-Z_ ]+)\" }}/
var out = re.exec('{{ a_name a_description:"a value" another_description: "another_value" }}')

out必要な一致を含む配列になります。

key: "value"一般的な数のペアをキャプチャする必要がある場合、これが役立ちます。

var str = '{{ a_name a_description: "a value" another_description: "another_value" }}'
var pat = /[a-zA-Z_]+: "[a-zA-Z_ ]*"/gi
str.match(pat)
于 2012-04-19T17:44:44.963 に答える
0

この場合の正しい方法は、ウォーターフォール アプローチだと思います。最初に関数名を抽出し、次に を使用してパラメーターを解析しますsplit

var testString = '{{ a_name a_description:"a value" another_description: "another_value" }}';
var parser = /(\w+)\s*([^}]+)/;
var parts  = parser.exec(testString);

console.log('Function name: %s', parts[1]);
var rawParams = parts[2].split(/\s(?=\w+:)/);
var params    = {};
for (var i = 0, l = rawParams.length; i < l; ++i) {
  var t = rawParams[i].split(/:/);
  t[1] = t[1].replace(/^\s+|"|\s+$/g, ''); // trimming
  params[t[0]] = t[1];
}
console.log(params);

しかし、私は間違っているかもしれません。)

于 2012-06-20T13:21:36.133 に答える