2012-06-27 55 views
6

Nếu tôi có chuỗi giống như "11E12C108N", đây là một kết nối của các nhóm chữ và nhóm chữ số, làm cách nào để phân tách chúng mà không có ký tự dấu cách phân cách?Số phân tách Regex và các nhóm chữ không có dấu cách

Ví dụ, tôi muốn chia kết quả là:

tokens[0] = "11" 
tokens[1] = "E" 
tokens[2] = "12" 
tokens[3] = "C" 
tokens[4] = "108" 
tokens[5] = "N" 

Tôi có này ngay bây giờ.

public static void main(String[] args) { 

    String stringToSplit = "11E12C108N"; 

    Pattern pattern = Pattern.compile("\\d+\\D+"); 
    Matcher matcher = pattern.matcher(stringToSplit); 

    while (matcher.find()) { 
     System.out.println(matcher.group()); 
    } 
} 

nào mang lại cho tôi:

11E 
12C 
108N 

Tôi có thể làm cho regex ban đầu làm một tách hoàn toàn trong một đi? Thay vì phải chạy lại regex trên các mã thông báo trung gian?

Trả lời

5

Sử dụng regex sau và nhận danh sách tất cả các kết quả phù hợp. Đó sẽ là những gì bạn đang tìm kiếm.

\d+|\D+ 

Trong Java, tôi nghĩ rằng mã sẽ giống như thế này:

Matcher matcher = Pattern.compile("\\d+|\\D+").matcher(theString); 
while (matcher.find()) 
{ 
    // append matcher.group() to your list 
} 
3

Bạn cũng có thể sử dụng "nhìn xung quanh" trong chia regex

String stringToSplit = "11E12C108N"; 
String[] tokens = stringToSplit .split("(?<=\\d)(?=\\D)|(?=\\d)(?<=\\D)"); 
System.out.println(Arrays.toString(tokens)); 

ra [11, E, 12, C, 108, N]

Ý tưởng là chia nhỏ các địa điểm nằm giữa các chữ số (\d) và không phải chữ số (\D). Nói cách khác, nó là nơi (trống string) có:

  • chữ số trước (?<=\d) và không chữ số sau khi nó (?=\D)
  • phi chữ số trước (?<=\D) và chữ số sau khi nó (?=\d)

Thông tin thêm khoảng (?<=..)(?=..) (và một vài chi tiết khác) bạn có thể tìm thấy tại http://www.regular-expressions.info/lookaround.html

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