2013-04-23 42 views
6

Tôi có điều này:Java - biểu thức chính quy cho định dạng get số

  • 110121 TỰ NHIÊN 95 1570,40
  • 110.121 TỰ NHIÊN 95 1570,40 *
  • 41.110 1 x 38,20 CZK) [A ] *
  • '31.831 261.791 1308,61)
  • > 01.572 Pravo SO 17,00
  • 1.000 ks x 17,00
  • 1570,40

Mỗi dòng sản lượng này được lưu trong Danh sách và tôi muốn để có được số 1570,40

biểu thức thông thường của tôi trông như thế này cho loại định dạng

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

Tôi có một vấn đề rằng 1570,40 ở dòng cuối cùng nếu được thành lập (bởi biểu thức chính quy thứ hai), cũng 1570,40 (từ dòng với 1570,40 * ở cuối) nhưng dòng đầu tiên không được thành lập .. bạn có biết đâu là vấn đề?

+2

Tôi hơi bối rối. Bạn đang sử dụng cụm từ thông dụng nào? Đầu tiên hoặc thứ hai. Và bạn chỉ muốn tìm kết quả cuối cùng, đúng không? –

+1

Lưu ý rằng '[a | b]' là 'a' hoặc' | 'hoặc' b'. Trong danh sách ký tự, '|' là * không * một dấu phân cách thay thế. Vì vậy, '[.,]' Nên là những gì bạn muốn. Nhưng đối với tất cả tôi có thể nói, regexp thứ hai nên làm việc. –

+0

Tôi sử dụng cả hai ... Tôi có priceFormats.add ("([1-9] [0-9] * [\\. |,] [0-9] {2}) [^ \\. \\ d ] (. *) "); và priceFormats.add ("^ ([1-9] [0-9] * [\\. |,] [0-9] {2}) $"); ... nó là Danh sách các định dạng giá và sau đó có một chu kỳ mà tôi áp dụng cho (int i = 0; i

Trả lời

1

Không chắc tôi cũng hiểu nhu cầu của bạn, nhưng tôi nghĩ rằng bạn có thể sử dụng ranh giới từ như:

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

Để không phù hợp với ngày tháng, bạn có thể sử dụng:

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

giải thích:

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

Cảm ơn bạn, bạn đã cứu mạng sống và công việc của tôi! –

+0

Nhưng vẫn ... Ví dụ khi tôi có "16.10.2012" để ranh giới không hoạt động ... mẫu trả về 16.10 –

0

Hãy thử điều này:

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], điều đó có nghĩa là nó mong đợi một biểu tượng không phải là chữ số, không dấu chấm ngay sau số. Dòng thứ hai có * khớp với nó. Dòng đầu tiên có số ở cuối dòng, vì vậy không có gì phù hợp. Tôi nghĩ rằng bạn chỉ cần một regexp mà sẽ bắt tất cả các số: [^.\\d]*([1-9][0-9]*[.,][0-9]{2})[^.\\d]*. Ngoài ra, bạn nên sử dụng find thay vì match để tìm bất kỳ chuỗi con nào trong chuỗi thay vì khớp toàn bộ chuỗi. Ngoài ra, có lẽ nó có một cảm giác để tìm tất cả các trận đấu trong trường hợp nếu một dòng có hai con số như vậy trong nó, không chắc chắn nếu nó là một trường hợp cho bạn hay không.

Ngoài ra, hãy sử dụng [0-9] hoặc \d. Tại thời điểm này nó là khó hiểu - nó có nghĩa là giống nhau, nhưng trông khác nhau.

Các vấn đề liên quan