2013-04-23 12 views
6

ho questo:Java - espressione regolare per il formato numero get

  • 110121 NATURALE 95 1570,40
  • 110121 NATURALE 95 1570,40 *
  • 41.110 1 x 38,20 CZK) [A ] *
  • '31.831 261.791 1308,61)
  • > 01572 Pravo SO 17,00
  • 1.000 ks x 17,00
  • 1570,40

ogni riga di questa uscita viene salvato in List e voglio ottenere il numero 1570,40

mie espressioni regolari si presenta così per questo tipo di formato

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

Ho un problema che 1570,40 all'ultima riga se fondata (secondo la seconda espressione regolare), anche 1570,40 (dalla riga con 1570,40 * alla fine) ma la prima riga non è fondata .. sai dov'è il problema?

+2

Sono un po 'confuso. Quale espressione regolare stai usando? Primo o secondo. E vuoi solo trovare l'ultimo risultato, giusto? –

+1

Nota che '[a | b]' è 'a' o' | 'o' b'. Negli elenchi di caratteri, '|' è * non * un separatore di alternative. Quindi '[.,]' Dovrebbe essere quello che vuoi. Ma per quanto posso dire, la seconda regexp dovrebbe funzionare. –

+0

Io uso entrambi ... Ho priceFormats.add ("([1-9] [0-9] * [\\. |,] [0-9] {2}) [^ \\. \\ d ] ") (*).; e priceFormats.add ("^ ([1-9] [0-9] * [\\. |,] [0-9] {2}) $"); ... è un elenco di formati di prezzo e quindi un ciclo per cui si applica (int i = 0; i

risposta

1

Non sono sicuro Comprendo bene le vostre esigenze, ma penso che si potrebbe usare confini di parola come:

\b([1-9]\d*[.,]\d{2})\b 

Al fine di non corrispondere le date, è possibile utilizzare:

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

spiegazione:

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 
---------------------------------------------------------------------- 
+0

Grazie, mi hai salvato la vita e il lavoro! –

+0

Ma ancora ... Per esempio, quando ho "16.10.2012" quindi il limite non funziona ... il modello restituisce 16.10 –

0

Prova questo:

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

Il "([1-9][0-9]*[\\.|,][0-9]{2})[^\\.\\d](.*)" ha [^\\.\\d], vuol dire che si aspetta uno non sia una cifra, il simbolo non-dot subito dopo il numero. La seconda riga ha * che lo corrisponde. La prima riga ha il numero alla fine della riga, quindi niente corrisponde. Penso che tu abbia bisogno di una sola regexp che catturi tutti i numeri: [^.\\d]*([1-9][0-9]*[.,][0-9]{2})[^.\\d]*. Inoltre, dovresti usare find anziché match per trovare una sottostringa in una stringa invece di far corrispondere l'intera stringa. Inoltre, forse ha senso trovare tutte le corrispondenze nel caso in cui una linea contenga due numeri di questo tipo, non è sicuro che sia un caso per te o meno.

Inoltre, utilizzare [0-9] o \d. Al momento è confusionario - significa lo stesso, ma ha un aspetto diverso.

Problemi correlati