2011-04-07 45 views
10

Có ai có thể hỗ trợ tôi với một số regex không.Tách chuỗi bằng Regex trong Java

Tôi muốn chia chuỗi sau đây vào một số, số chuỗi

"810LN15"

1 phương pháp đòi hỏi 810 để được trả lại, một đòi hỏi LN và khác nên trả lại 15.

Chỉ có thực sự giải pháp cho điều này là sử dụng regex vì các con số sẽ tăng trưởng theo chiều dài

Tôi có thể sử dụng regex nào để chứa điều này?

+0

Câu hỏi của bạn không rõ ràng. Bạn có muốn chia nhỏ trên "LN" hoặc trên bất kỳ chuỗi chữ cái nào không? –

+0

Hi Laurent. Trong các phương thức khác nhau, tôi cần lấy một phần khác của chuỗi này, 1 phương thức cần 810 để được trả về, phương thức khác yêu cầu LN và yêu cầu cuối cùng 15. Tôi không muốn đi xuống tuyến đường sử dụng chuỗi và chuỗi tính theo độ dài của các con số có thể thay đổi. Trợ giúp của bạn được đánh giá cao với điều này – Damien

Trả lời

16

String.split sẽ không cung cấp cho bạn kết quả mong muốn, mà tôi đoán là "810", "LN", "15", vì nó sẽ phải tìm mã thông báo để tách và sẽ xóa mã thông báo đó.

Hãy thử PatternMatcher thay vào đó, sử dụng regex này: (\d+)|([a-zA-Z]+), mà sẽ phù hợp với bất kỳ chuỗi các số và chữ cái và nhận được nhóm số/văn bản riêng biệt (tức là "AA810LN15QQ12345" sẽ cho kết quả trong nhóm "AA", "810", "LN", "15", "QQ" và "12345").

Ví dụ:

Pattern p = Pattern.compile("(\\d+)|([a-zA-Z]+)"); 
Matcher m = p.matcher("810LN15"); 
List<String> tokens = new LinkedList<String>(); 
while(m.find()) 
{ 
    String token = m.group(1); //group 0 is always the entire match 
    tokens.add(token); 
} 
//now iterate through 'tokens' and check whether you have a number or text 
+0

Hi Thomas, cảm ơn rất nhiều cho đầu vào của bạn, vấn đề của tôi bây giờ được giải quyết – Damien

7

(\\d+)([a-zA-Z]+)(\\d+) nên làm các trick. Nhóm chụp đầu tiên sẽ là số đầu tiên, nhóm chụp thứ hai sẽ là các chữ cái ở giữa và nhóm chụp thứ ba sẽ là số thứ hai. Các dấu gạch chéo ngược đôi là dành cho java.

+0

Cảm ơn rất nhiều cho Mark đầu vào của bạn, nó đã giúp tôi giải quyết vấn đề của tôi – Damien

10

Trong Java, giống như hầu hết các hương vị regex (Python là ngoại lệ đáng chú ý), không cần phải có split() regex để tiêu thụ bất kỳ ký tự nào khi tìm thấy đối sánh. Ở đây tôi đã sử dụng lookaheads và lookbehinds để phù hợp với bất kỳ vị trí mà có một chữ số một mặt của nó và một tổ chức phi chữ số bên kia:

String source = "810LN15"; 
String[] parts = source.split("(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)"); 
System.out.println(Arrays.toString(parts)); 

đầu ra:

[810, LN, 15] 
0

này mang đến cho bạn chính xác những điều bạn đang tìm kiếm

 Pattern p = Pattern.compile("(([a-zA-Z]+)|(\\d+))|((\\d+)|([a-zA-Z]+))"); 
     Matcher m = p.matcher("810LN15"); 
     List<Object> tokens = new LinkedList<Object>(); 
     while(m.find()) 
     { 
      String token = m.group(1); 
      tokens.add(token); 
     } 
     System.out.println(tokens); 
Các vấn đề liên quan