Comment composer une regex avec une condition en Java?

Aug 30 2020

Condition :

  • les nombres peuvent être entiers ou doubles (total de 8 chiffres)
  • les nombres ne peuvent être séparés que par des espaces (un ou plusieurs) et des virgules (0 ou un)
  • les virgules ne peuvent être que des nombres intérieurs (il ne peut y avoir aucune virgule au début et à la fin d'une ligne)
  • il peut y avoir des espaces au début de la ligne (un ou plusieurs)
  • il peut y avoir des espaces à la fin de la ligne (un ou plusieurs)

Ce que je fais :

([\s]*\d+(\.{1}\d+)?[\s\,\s]+){7}(\d+(\.{1}\d+)?[\s]*){1}
                    ^ this   ^

Ce n'est pas grave, sauf pour une condition.
Sur cette chaîne true, j'obtiens , mais j'ai besoin false:

String s1 = " 0 , 4.4 3.2,, 4.1      2 4 1 7.7";

Je ne peux pas faire ça:

Les nombres peuvent être séparés par une seule virgule ou pas de virgule, mais dans ce cas, il doit y avoir un espace (un ou plusieurs).

Réponses

1 Gryphon Aug 30 2020 at 06:23

C'est celui que j'ai proposé pour les espaces / virgules (également supprimé certaines parties redondantes):

Pattern.compile("([\\s]*\\d+(\\.\\d+)?(?:\\s*,\\s*|\\s+)){7}(\\d+(\\.\\d+)?[\\s]*)");

Semble faire ce que vous voulez avec l'échantillon que vous avez fourni, au moins. (L'utilisation de {1}est généralement implicite pour les endroits où vous l'avez utilisée, donc je les ai supprimées)