次のURL文字列のcomma-separated
値でキャプチャグループを繰り返す方法を理解しようとしています。
id=1,2;name=user1,user2,user3;city=Oakland,San Francisco,Seattle;Zip=94553,94523;
私はこのRegExp
を使用しています。これは、動的であるため値を除いて、必要な結果を返します。 urlパラメータに2、3、4などのユーザーが含まれている可能性があり、1つのキャプチャグループとしてuser1,user2,user3
の代わりに、値ごとにキャプチャグループを作成できるかどうか疑問に思っていました。
RegExp:(^|;|:)(\w+)=([^;]+)*
これは、RegExpを使用したオンラインでのライブデモです。
出力例:
など...前に説明したような動的な値に基づいています。
質問:使用している式の何が問題になっていますか*
繰り返されるパターンをループしますか?
正規表現は、あなたがやろうとしていることをサポートしていません。エンジンが2回目にキャプチャグループに入ると、最初にキャプチャしたものが上書きされます。簡単な例を考えてみましょう(ありがとう regular-expressions.info ):/(abc|123)+/
は_'abc123'
_で使用されます。 「abc」と一致し、プラスが表示されて「123」と一致して再試行します。出力の最終的なキャプチャグループは「123」になります。
これは、どのパターンを試しても発生し、設定した制限は、正規表現が文字列を受け入れるときに変更されるだけです。 /(abc|123){2}/
を検討してください。これは、キャプチャグループが「123」の「abc123」を受け入れますが、「abc123abc」は受け入れません。キャプチャグループを別のグループ内に配置することもできません。キャプチャグループを作成するときは、変数を作成するようなものです。値は1つだけで、後続の値が前の値を上書きします。括弧のペアよりも多くのキャプチャグループを作成することはできません(ただし、確実に少なくすることもできます)。
考えられる修正は、「;」で文字列を分割し、次に「=」で文字列を分割し、次に「、」で文字列の右側を分割することです。それはあなたに_[['id', '1', '2'], ['name', 'user1', ...], ['city', ...], ['Zip', ...]]
_を与えるでしょう。
それは次のようになります:
_function (str) {
var afterSplit = str.split(';|:');
afterSplit.pop() // final semicolon creates empty string
for (var i = 0; i < afterSplit.length; i++) {
afterSplit[i] = afterSplit[i].split('=');
afterSplit[i][1] = afterSplit[i][1].split(','); // optionally, you can flatten the array from here to get something nicer
}
return afterSplit;
}
_
キャプチャグループの繰り返し
文字列:!abc123def!正規表現:/!((abc | 123 | def)+)!/
一致:
グループ1:abc123def
グループ2:def