2017-04-17 12 views
4

私はこの中でcomma-separated値に以下のURL文字列キャプチャグループを繰り返すことができます方法を理解しようとしている繰り返し:私はこのRegExpを使用してい正規表現 - キャプチャグループ

id=1,2;name=user1,user2,user3;city=Oakland,San Francisco,Seattle;zip=94553,94523;

をそれらが動的なので、値を除いて、私が望む結果を返します。 2,3,4などのurlパラメータのユーザーになる可能性があり、キャプチャグループとしてuser1,user2,user3の代わりに各値のキャプチャグループを作成できるかどうか疑問に思っていました。

正規表現: - (セミコロン、コロン)

    • グループ1:(^|;|:)(\w+)=([^;]+)*

      ここでは、RegExp

      の出力例を使用してオンラインでのライブデモですグループ2 - (キー、つまり、ID、名前、都市、ジップ)

    • グループ3 - (値1)
    • GROUP4 - (値2)*
    • GROUP5存在する場合 - (VALUE3を)*
    • Group6存在する場合 -

    などが存在する場合(value4)※...ベース私が前に説明したような動的な値について。

    質問:いただきました間違った私の表現で、私は繰り返しパターンをループに*を使用していますか?

  • +1

    あなたの予想される出力は何ですか?私はこれが正規表現を使わずにできると思う。 –

    +1

    '' "id":["1"、 "2"]、 "name":["user1"、 "user2"、 "user3"]、 "city":["Oakland" 、 "San Francisco"、 "Seattle"]、 "zip":["94553"、 "94523"]} '? –

    +0

    @ibrahimmahrir上記の出力例を示しましたが、値は 'user1、user2、etc ... 'のように動的なので、基本的に各値を自分の' capture-group'にします。 –

    答えて

    3

    正規表現は、あなたがしようとしていることをサポートしていません。エンジンがキャプチャグループに2回目に入ると、最初にキャプチャしたものが上書きされます。簡単な例を考えてみましょう(regular-expressions.info)。/(abc|123)+/'abc123'で使用されています。それは "abc"にマッチし、プラスを見て "123"にマッチして、やり直してください。出力の最後のキャプチャグループは "123"になります。

    これは、どんなパターンを試しても関係なく、正規表現が文字列を受け入れるときに設定した制限が変わるだけです。 /(abc|123){2}/を検討してください。これは、キャプチャグループを「123」とし、「abc123abc」ではなく「abc123」を受け入れます。キャプチャグループを別のグループに入れても機能しません。キャプチャグループを作成するときは、変数を作成するようなものです。 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; 
    } 
    
    関連する問題