Tôi có thể bị nhầm lẫn trong phần này, vì lý do tách biệt hai là vì
group() sẽ chỉ khớp với các kết quả trùng khớp cuối cùng, bất cứ điều gì được khớp với mỗi cuộc gọi đến
find().
Xin cảm ơn, Mark Byers.
Để chắc chắn, bạn có thể giải quyết điều này bằng cách đặt toàn bộ phần bạn muốn bên trong "nhóm chụp", được thực hiện bằng cách đặt nó vào dấu ngoặc đơn. Điều này làm cho nó để bạn có thể nhóm các phần phù hợp với nhau của biểu thức chính quy của bạn thành một chuỗi con. mô hình của bạn sau đó sẽ như thế nào:
Pattern.compile("C=(\\d+\\.\\d+)")
Đối với phân tích 3567 hoặc 3,567, mô hình của bạn sẽ làC=(\\d+(\\.\\d+)?)
với nhóm 1 đại diện cho toàn bộ số.Ngoài ra, hãy lưu ý rằng vì bạn đặc biệt muốn khớp với một khoảng thời gian, bạn muốn thoát khỏi ký tự .
(dấu chấm) của bạn để nó không được hiểu là mã thông báo "bất kỳ ký tự". Tuy nhiên, đối với đầu vào này, không quan trọng
Sau đó, để nhận được 3.567, bạn sẽ gọi cho m. group(1) để lấy nhóm đầu tiên (tính từ 1) nhóm được chỉ định. Điều này có nghĩa là cuộc gọi Double.parseDouble của bạn về cơ bản sẽ trở thành Double.parseDouble("3.567")
Vì đã lấy C = trong mẫu của bạn, vì tôi không thành thạo với RegExp, tôi có thể khuyên bạn split chuỗi đầu vào của bạn trên bán dấu hai chấm và sau đó kiểm tra xem mỗi phân tách có chứa C hay không; sau đó bạn có thể áp dụng các mô hình (với các nhóm chụp) để có được 3.567 từ Matcher của bạn.
Sửa Đối với các tổng quát hơn (và nhiều khả năng hữu ích!) Các trường hợp trong bình luận gawi, xin vui lòng sử dụng sau đây (từ http://www.regular-expressions.info/floatingpoint.html)
Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")
này đã hỗ trợ cho dấu tùy chọn, hoặc là số nguyên tùy chọn hoặc tùy chọn phần thập phân và số mũ dương/âm tùy chọn. Chèn các nhóm chụp nơi bạn muốn chọn từng phần riêng lẻ. Số mũ tổng thể nằm trong nhóm riêng của nó để làm cho nó, như một toàn thể, tùy chọn.
Dấu chấm (".") Không phải là chữ số. –