Eu tenho a seguinte expressão regex:
^(\d*)(?:\.)(\d*)(?:|(?:\.)(\d*))(?:|(?:\.)([a-zA-Z0-9_-]*))?$
Você pode testá-lo aqui .
Eu quero usá-lo para analisar um número de versão em grupos, por exemplo (onde G1 é o número do grupo 1 e assim por diante):
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)
Esta quase funciona, salvo se o terceiro grupo é opcional, e salta para o quarto grupo se a versão tem 3 partes.
Então, o que realmente acontece é o seguinte:
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)
Eu não consigo identificar o que estou fazendo de errado.
A forma como ele está trabalhando agora também significa que o seguinte é válido: 1.2.3_or_text
uma vez que é analisado comog1(1),g2(2),g3(),g4(3_or_text)
Você está tendo extra de alternation(|)
expressão em seu regex
^(\d*)(?:\.)(\d*)(?:|(?:\.)(\d*))(?:|(?:\.)([a-zA-Z0-9_-]*))?$
^ ^
this this
Ele diz para combinar nada que sempre passa. Como resultado a sua segunda parte da alternância não corresponde.
Mais explicações : sintaxe Alternância é como
(?:a|b|c)
No seu caso a
não é nada, é por isso que é sempre verdadeiro e partidas
Solução correta : Você também estão faltando grupo opcional e assumindo deve haver pelo menos um dígito ou alfabeto, esta deve ser regex correto
^(\d+)(?:\.)(\d+)(?:(?:\.)(\d+))?(?:(?:\.)([a-zA-Z0-9_-]+))?$
^(\d+)[.](\d+)(?:[.](\d+)(?:[.]([\w-]+))?)?$
regex Breakdown
^ #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