どのように私はキャプチャグループ3のパラメータ3回の滞在ので、私の正規表現を修正することができますか?

bot_bot:

私は、次の正規表現の式があります。

^(\d*)(?:\.)(\d*)(?:|(?:\.)(\d*))(?:|(?:\.)([a-zA-Z0-9_-]*))?$

あなたはそれをテストすることができ、ここで
私は(G1はグループ番号1などである。)例えば、グループにバージョン番号を解析するためにそれを使用します:

1.2              =>  g1(1),g2(2)    
1.2.3            =>  g1(1),g2(2),g3(3)    
1.2.3.4_or_text  =>  g1(1),g2(2),g3(3),g4(4_or_text)  

これは、ほぼ第三グループは任意であり、バージョンは3つの部分を有する場合、第四のグループにスキップした場合を除いて、機能します。
それでは、実際に起こることはこれです:

1.2              =>  g1(1),g2(2)    
1.2.3            =>  g1(1),g2(2),g3(),g4(3)           <-- I want to fix this
1.2.3.4_or_text  =>  g1(1),g2(2),g3(3),g4(4_or_text) 

私は私が間違ってやって特定することはできません。

それは今も働いている方法は、以下が有効であることを意味します。1.2.3_or_textそれは次のように解析されるので、g1(1),g2(2),g3(),g4(3_or_text)

rock321987:

あなたは余分な持っているalternation(|)あなたの正規表現で式を

^(\d*)(?:\.)(\d*)(?:|(?:\.)(\d*))(?:|(?:\.)([a-zA-Z0-9_-]*))?$
                    ^               ^
                   this            this

それは一致しないように指示し、何も常に渡します。その結果、交代のあなたの第二の部分は一致することはありません。

さらなる説明は:交替の構文は次のようです

(?:a|b|c)

あなたのケースではa何もありません、だからこそ、その常に真と一致

正解:あなたはまた、オプションのグループが欠落して少なくとも1桁またはアルファベットがあるはずと仮定され、これが正しい正規表現でなければなりません

^(\d+)(?:\.)(\d+)(?:(?:\.)(\d+))?(?:(?:\.)([a-zA-Z0-9_-]+))?$

クリーンなソリューションのビット

^(\d+)[.](\d+)(?:[.](\d+)(?:[.]([\w-]+))?)?$

正規表現の内訳

^ #Start of string
 (\d+)[.] #Match digit and dot
 (\d+) #Match next group

 (?: #Non-capturing group
   [.](\d+) #Match dot and digit
   (?:[.]([\w-]+))? #Match dot and digit. This is optional
 )? #Third and Fourth match can be optional

$ #End of string

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=233191&siteId=1