2013-04-23 4 views
6

У меня есть это:Java - регулярное выражение для формата чисел прибудете

  • 110121 NATURAL 95 1570,40
  • 110121 NATURAL 95 1570,40 *
  • 41.110 1 х 38,20 крон) [A ] *
  • '31.831 261.791 1308,61)
  • > 01572 právo SO 17,00
  • 1000 кс х 17,00
  • 1570,40

Каждая строка этого вывода сохраняется в списке, и я хочу, чтобы получить номер 1570,40

Мои регулярные выражения выглядит следующим образом для этого типа формата

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

У меня есть проблема что 1570,40 на последней строке, если она была основана (вторым регулярным выражением), также 1570,40 (из строки 1570,40 * в конце), но первая строка не основана .. знаете ли вы, где проблема?

+2

Я немного смущен. Какое регулярное выражение вы используете? Первый или второй. И вы только хотите найти последний результат, не так ли? –

+1

Обратите внимание, что '[a | b]' является 'a' или' | 'или' b'. В списках символов '|' is * not * разделитель альтернатив. Поэтому '[.,]' Должен быть тем, что вы хотите. Но для всего, что я могу сказать, второе регулярное выражение должно работать. –

+0

Я использую оба ... У меня есть priceFormats.add ("([1-9] [0-9] * [\\. |,] [0-9] {2}) [^ \\. \\ d ] ") (*.); и priceFormats.add ("^ ([1-9] [0-9] * [\\. |,] [0-9] {2}) $"); ... это список ценовых форматов, а затем для цикла, в который я подаю заявку (int i = 0; i

ответ

1

Не уверен, что я хорошо понимаю ваши потребности, но я думаю, вы могли бы использовать границы слова как:

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

Для того, чтобы не соответствовать датам, вы можете использовать:

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

объяснение:

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

Спасибо, ты спас мне жизнь и работу! –

+0

Но все же ... Например, когда у меня есть «16.10.2012», поэтому граница не работает ... шаблон возвращает 16.10 –

0

Попробуйте это:

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

"([1-9][0-9]*[\\.|,][0-9]{2})[^\\.\\d](.*)" имеет [^\\.\\d], это означает, что он ожидает, что один не-разрядного без многоточия символа сразу после числа. Вторая строка имеет *, которая соответствует ей. Первая строка имеет номер в конце строки, поэтому ничего не соответствует. Я думаю, вам нужно всего лишь одно регулярное выражение, которое поймает все числа: [^.\\d]*([1-9][0-9]*[.,][0-9]{2})[^.\\d]*. Кроме того, вы должны использовать find вместо match, чтобы найти любую подстроку в строке вместо того, чтобы соответствовать всей строке. Кроме того, может быть, имеет смысл найти все совпадения в случае, если в строке есть два таких числа, не уверен, что это случай для вас или нет.

Также используйте либо [0-9], либо \d. На данный момент это сбивает с толку - это значит одно и то же, но выглядит по-другому.