web-dev-qa-db-ja.com

正規表現-キャプチャグループの繰り返し

次の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を使用したオンラインでのライブデモです。

出力例:

  • グループ1-(セミコロン、コロン)
  • Group2-(キー、つまりid、name、city、Zip)
  • グループ3-(値1)
  • Group4-(value2)*存在する場合
  • Group5-(value3)*存在する場合
  • Group6-(value4)*存在する場合

など...前に説明したような動的な値に基づいています。

質問:使用している式の何が問題になっていますか*繰り返されるパターンをループしますか?

10
Jordan Davis

正規表現は、あなたがやろうとしていることをサポートしていません。エンジンが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;
}
_
13
Peter G

キャプチャグループの繰り返し

文字列:!abc123def!正規表現:/!((abc | 123 | def)+)!/

一致:

グループ1:abc123def

グループ2:def

ソース: https://www.regular-expressions.info/captureall.html

0
Pyetro