2012-04-12 34 views
5

Tôi có một regex kiểm tra xem chuỗi có phải là một số hay không. Bộ tách nghìn của định dạng là khoảng trắng, dấu phân cách thập phân là dấu chấm. Phần sau thập phân là tùy chọn.Java regex String.matches hoạt động không nhất quán

Vấn đề ở chỗ một số hàm String.matches() ngừng hoạt động như mong đợi. Những gì đã làm việc trước đây, không hoạt động nữa.

Ví dụ, mã JUnit:

import junit.framework.Assert; 
import org.junit.Test; 

public class RegExTest { 

    @Test 
    public void testThousandSeperatorRegex() 
    { 
     String regEx = "([0-9]{1,3}([0-9]{3})*(\\.[0-9]+)?|\\.[0-9]+)"; 
     Assert.assertEquals(true, "1".matches(regEx)); 
     Assert.assertEquals(true, "10".matches(regEx)); 
     Assert.assertEquals(true, "100".matches(regEx)); 
     Assert.assertEquals(true, "1 000".matches(regEx)); 
     Assert.assertEquals(true, "10 000".matches(regEx)); 
     Assert.assertEquals(true, "100 000".matches(regEx)); 
     Assert.assertEquals(true, "1 000 000".matches(regEx)); 
     Assert.assertEquals(true, "10 000 000".matches(regEx)); 
     Assert.assertEquals(false, "10000.56".matches(regEx)); 
     Assert.assertEquals(true, "8 734".matches(regEx)); 
    } 
} 

Dòng cuối cùng với "8 734" thất bại. Khi tôi thay thế nó bằng "1 000", nó tiếp tục thất bại. Cuối cùng, cùng một mã ở cùng một lần chạy trong dòng xác nhận thứ 4, nhưng không thành công trong lần cuối cùng (mã mới được lưu!). Nhưng có những lúc mọi thứ bắt đầu hoạt động như mong đợi cho đến khi .. bắt đầu thất bại lần nữa. Vì vậy, tôi cho rằng sẽ rất khó để tái tạo vấn đề của tôi. Có lẽ có điều gì đó khác mà tôi đang làm sai mà tôi đã không nhận thấy và do đó mô tả, nhưng tôi đã cố gắng để làm cho nó càng đơn giản càng tốt. Điều này làm tôi bối rối. String.matches() có bộ nhớ hay cái gì?

Có thể có điều gì đó sai với cụm từ thông dụng không? Tôi bỏ qua ^$ như String.matches hoạt động trên toàn bộ chuỗi anyway. Tôi đã thử các gói java.util.regex và jregex, vấn đề vẫn tồn tại.

Tôi đang sử dụng JDK 6u31.

Bất kỳ ý tưởng nào được đánh giá cao.

UPD: ok, sau khi đăng bài này Q mã bắt đầu hoạt động và không bị lỗi cho đến thời điểm này. Có lẽ đó là một cái gì đó với tôi, nhưng điều này đã làm phiền tôi kể từ tuần trước và tôi đã có thể tái tạo nó một lần nữa và một lần nữa. Tôi sẽ tiếp tục với đoạn mã của tôi và nếu nó sẽ tiếp tục hoạt động, tôi sẽ đóng vấn đề này. Ngoài ra tôi sẽ cố gắng để xác định chính xác những gì gây ra vấn đề. Trong khi đó, nếu có ai đó ngoài kia gặp phải vấn đề tương tự, hãy chia sẻ kiến ​​thức của bạn. Nếu không, điều này trông giống như một vấn đề có thể được giải quyết bằng kiến ​​thức, không phải bằng cách gỡ lỗi. Để bảo vệ bản thân khỏi sự ngu ngốc, tôi có thể nói rằng tôi đã lập trình được nhiều năm và đây là bài đăng đầu tiên trong diễn đàn :). Cho đến bây giờ tôi đã có thể giải quyết vấn đề của mình bằng cách gỡ lỗi, đọc tài liệu và tìm kiếm các diễn đàn của các Q khác.

+0

Làm việc cho tôi trong JDK 6u19 –

+0

Bạn có thể đăng lớp thực tế gọi những bài kiểm tra JUnit này không? –

+4

Bạn có chắc chắn rằng bạn không chạy một lớp được biên dịch cũ? –

Trả lời

1

OK, cho đến nay tôi chưa gặp sự cố này nữa.

Đối với những người khác gặp phải điều này một ngày nào đó, tôi chỉ có thể đề xuất làm sạch môi trường mà bạn đang làm việc. Điều này phải làm điều gì đó với JVM bị lỗi hoặc trạng thái bộ nhớ của máy tính.

Cảm ơn tất cả mọi người vì những đóng góp của họ.

0

BTW: Cố gắng sử dụng mẫu được biên dịch trước Pattern p = Pattern.compile(regEx) và đối sánh đơn cho tất cả các xác nhận assertTrue(p.matcher("1 000 000").matches()). Phương thức đối sánh của chuỗi biên dịch mẫu regex mỗi khi bạn gọi nó là

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