2017-06-15 1 views
1

Je crée regex pour deux valeurs séparées par des virgules (exemple - Les coordonnées), je suis en utilisant regex comme ci-dessous -Regex pour seulement deux séparés par des virgules les valeurs, en gardant seconde valeur facultative

^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$ 

l'expression rationnelle ci-dessus mandate deux virgule valeurs séparées, mais je veux la deuxième valeur en option, y compris par des virgules, donc j'ai essayé de changer le regex comme ça -

^(\-?\d+(\.\d+)?)(,\s*(\-?\d+(\.\d+)?)$)? 

cela fonctionne, mais et en gardant la seconde valeur facultative, mais elle permet aussi à une virgule sans seconde valeur comme ci-dessous -

3456,

Qu'est-ce que l'on peut ajouter dans la regex ne permet pas une virgule si la deuxième valeur est absente? Merci.

+2

'$' L'ancre ne doit pas faire partie du groupe optionnel mais doit être placée derrière. –

+0

@SebastianProske Merci, cela semble fonctionner, c'est mon regex maintenant =^(\ -? \ D + (\. \ D +)?) (, \ S * (\ -? \ D + (\. \ D +)?))? –

Répondre

2

Vous avez égaré le quantificateur avec l'ancre.

Utilisez

^(-?\d+(\.\d+)?)(,\s*(-?\d+(\.\d+)?))?$ 
            ^^ 

Voir la regex demo.

Vous pouvez ajuster le nombre de groupes de capture dans votre modèle et convertir le groupe optionnel en non-capture en ajoutant ?: après l'ouverture (. Je l'utilise comme

^(-?\d+(?:\.\d+)?)(?:,\s*(-?\d+(?:\.\d+)?))?$ 

Voir another demo.

Notez également que vous n'avez pas besoin d'échapper un trait d'union en dehors d'une classe de caractères.

Lorsque vous utilisez en Java, ne pas oublier d'utiliser backslashes double pour définir un anti-slash dans la chaîne littérale et omettre ^ et $ si vous utilisez le modèle avec la méthode .matches():

s.matches("-?\\d+(?:\\.\\d+)?(?:,\\s*-?\\d+(?:\\.\\d+)?)?") 

Détails:

  • ^ - début de l'ancre de chaîne
  • (-?\d+(\.\d+)?) - Groupe 1 correspondant à une option h yphen, 1+ chiffres, puis une séquence facultative de groupe (2) d'un point suivi par un ou plusieurs chiffres
  • (,\s*(-?\d+(\.\d+)?))? - une séquence facultative de groupe (3) correspondant à un ou zéro occurrences de:
    • , - virgule
    • \s* - zéro ou plusieurs espaces blancs
    • (-?\d+(\.\d+)?) - Groupe 4 correspondant à
      • -? - un trait d'union
      • \d+ - une ou plusieurs chiffres
      • (\.\d+)? - Groupe 5 qui correspond à une séquence facultative d'un point suivi par 1 ou plusieurs chiffres
  • $ - fin de chaîne
+0

Désolé, l'accès mobile est horrible. Je ne peux pas formater l'explication correctement. –

+1

mieux? Vous avez manqué un espace après le premier minus de votre liste. –