1. ホーム
  2. ジャバスクリプト

[解決済み】RegExp.execを使って文字列からすべてのマッチを抽出するRegEx

2022-04-07 07:46:20

質問

次のような文字列を解析しようとしています。

[key:"val" key2:"val2"]

ここで、内部には任意の key:"val" のペアが存在します。キー名と値を取得したい。 タスクウォーリアーのデータベース形式をパースしようとしているのです。

以下は私のテスト文字列です。

[description:"aoeu" uuid:"123sth"]

これは、キーや値の中にスペース以外のものを入れることができること、コロンの周りにスペースを入れないこと、値は常に二重引用符で囲むことを強調するためのものである。

nodeでは、これが私の出力です。

[deuteronomy][gatlin][~]$ node
> var re = /^\[(?:(.+?):"(.+?)"\s*)+\]$/g
> re.exec('[description:"aoeu" uuid:"123sth"]');
[ '[description:"aoeu" uuid:"123sth"]',
  'uuid',
  '123sth',
  index: 0,
  input: '[description:"aoeu" uuid:"123sth"]' ]

しかし description:"aoeu" もこのパターンにマッチします。どうすればすべてのマッチを取り戻せますか?

解決方法は?

呼び出しを継続する re.exec(s) をループして、すべてのマッチを取得します。

var re = /\s*([^[:]+):\"([^"]+)"/g;
var s = '[description:"aoeu" uuid:"123sth"]';
var m;

do {
    m = re.exec(s);
    if (m) {
        console.log(m[1], m[2]);
    }
} while (m);

このJSFiddleで試してみてください。 https://jsfiddle.net/7yS2V/