6
votes

Java - Expression régulière pour obtenir le format de numéro de numéro

J'ai ceci:

  • 110121 Natural 95 1570,40 Li>
  • 110121 Natural 95 1570,40 * LI>
  • 41,110 1 x 38,20 CZK) [A] * LI>
  • '31 831 261 791 1308,61) LI>
  • > 01572 Pravo SO 17,00 LI>
  • 1000 ks x 17,00 li>
  • 1570,40 LI> ul>

    Chaque ligne de cette sortie est enregistrée dans la liste et je souhaite obtenir le numéro 1570,40 P>

    Mes expressions habituelles ressemblent à ceci pour ce type de format P>

        "([1-9][0-9]*[\\.|,][0-9]{2})[^\\.\\d](.*)"
        "^([1-9][0-9]*[\\.|,][0-9]{2})$"
    


5 commentaires

Je suis un peu confus. Quelle expression régulière utilisez-vous? Premier ou deuxième. Et vous voulez seulement trouver le dernier résultat, non?


Notez que [A | B] est A ou | ou B . Dans les listes de caractères, | est pas un séparateur alternatifs. Donc [.,] devrait être ce que vous voulez. Mais pour tout ce que je peux dire, la deuxième regexp devrait fonctionner.


J'utilise les deux ... j'ai prixformates.add ("([1-9] [0-9] * * [\\. |,] [0-9] {2}) [^ \\. \\ d] (. *) "); et prixformates.add ("^ ([1-9] [0-9] * * [\\. |,] [0-9] {2}) $"); ... c'est la liste des formats de prix, puis a un cycle pour le cycle où je demande (int i = 0; i


Voulez-vous 1570,40 pour être égalé dans chaque ligne? Et votre numéro de correspondance aura-t-il toujours un point de Decilam?


Oui, je veux que le nombre soit égalé dans chaque ligne ... La deuxième expression régulière (avec ^ and $) est là car la première regex ne correspondait pas au nombre placé dans une seule ligne (la dernière ligne).


3 Réponses :


0
votes

Essayez ceci:

String s = "41,110 1 x 38,20 CZK)[A] * ";
Matcher m = Pattern.compile("\\d+,\\d+").matcher(s);
while(m.find()) {
    System.out.println(m.group());
}


0 commentaires

1
votes

Je ne sais pas que je comprends bien vos besoins, mais je pense que vous pouvez utiliser des limites de mots comme: xxx pré>

Pour ne pas correspondre aux dates, vous pouvez utiliser: p>

The regular expression:

(?-imsx:(?:^|[^.,\d])(\d+[,.]\d\d)(?:[^.,\d]|$))

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  (?:                      group, but do not capture:
----------------------------------------------------------------------
    ^                        the beginning of the string
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    [^.,\d]                  any character except: '.', ',', digits
                             (0-9)
----------------------------------------------------------------------
  )                        end of grouping
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    \d+                      digits (0-9) (1 or more times (matching
                             the most amount possible))
----------------------------------------------------------------------
    [,.]                     any character of: ',', '.'
----------------------------------------------------------------------
    \d                       digits (0-9)
----------------------------------------------------------------------
    \d                       digits (0-9)
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  (?:                      group, but do not capture:
----------------------------------------------------------------------
    [^.,\d]                  any character except: '.', ',', digits
                             (0-9)
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    $                        before an optional \n, and the end of
                             the string
----------------------------------------------------------------------
  )                        end of grouping
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------


2 commentaires

Merci, tu as sauvé ma vie et ma vie!


Mais toujours ... Par exemple, quand j'ai "16.10.2012", la limite ne fonctionne pas ... Le motif renvoie 16,10



0
votes

le "([1-9] [0-9] * [\\. |,] [0-9] {2}) [^ \\. \\ d] (. *)" a [^ \\. \\ d] , cela signifie qu'il s'attend à un symbole non-points non chiffre, juste après le nombre. La deuxième ligne a * qui correspond à elle. La première ligne a le nombre en fin de ligne, alors rien ne correspond. Je pense que vous n'avez besoin que d'une non-greexp qui attrapera tous les numéros: [^. \\ d] * ([0-9] [0-9] * [.,] [0-9] {2}) [ ^. \\ d] * . De plus, vous devez utiliser trouver au lieu de correspondant pour trouver une sous-chaîne dans une chaîne au lieu de correspondre à la chaîne entière. En outre, il a peut-être un sens de trouver tous les matchs au cas où une ligne ait deux numéros de ce type, je ne sais pas si c'est un cas pour vous ou non.

Aussi, utilisez [0-9] ou \ d . Pour le moment, il est déroutant - cela signifie la même chose, mais semble différemment.


0 commentaires