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