2010-09-21 38 views
8

Tôi đang cố gắng sử dụngChuỗi chia không trả kết quả rỗng

"value1:value2::value3".split(":"); 

Vấn đề là tôi muốn nó bao gồm kết quả trống.

Nó trả về: [value1, value2, value3]
Nó nên là: [value1, value2, , value3]

Có ai biết regexp để sửa lỗi này?

Ok tôi đã tìm thấy nguyên nhân gây ra sự cố. Tôi thực sự đọc một tập tin văn bản và nó chứa dòng này:

123:;~\&:ST02:M:test:M:4540145::type;12:51253:D:2.2:567766::AL:::::::2.2b 

Khi tôi xử lý dòng này đọc các tập tin văn bản nó tạo ra kết quả sai lầm nêu trên, đó là nó không bao gồm bất kỳ kết quả rỗng trong các trường hợp như thế này: :::::.

Nhưng khi tôi sử dụng dòng trên trong chương trình thử nghiệm, nó không biên dịch và tôi nhận được "chuỗi thoát không hợp lệ". Tôi nghĩ rằng nó vì "\ &".

Có cách nào giải quyết vấn đề này bằng cách sử dụng cụm từ thông dụng không?

Trả lời

18

split không bao gồm các trận đấu có sản phẩm nào trong kết quả, có một cái nhìn tại docs here. Tuy nhiên, theo mặc định, các chuỗi rỗng có dấu (ở cuối mảng) sẽ bị loại bỏ. Nếu bạn muốn bao gồm những điều này, hãy thử split(":", -1).

+0

Cảm ơn ... thêm một -1 thực sự giải quyết các vấn đề ký tự đặc biệt khi đọc từ tập tin văn bản. Nó cũng bao gồm các chuỗi rỗng. – Marquinio

+1

liên kết tài liệu không hoạt động. –

1

Tôi thực sự không thấy sự phân chia lớn. StringTokenizer hoạt động tốt cho hầu hết mọi thứ như thế này và sẽ dễ dàng gửi lại các thẻ (vì vậy bạn có thể nói không có gì ở giữa ::).

Tôi chỉ muốn nó hoạt động tốt hơn một chút với phần tăng cường cho vòng lặp, nhưng điều đó sang một bên, nó sẽ không làm tổn thương để thử.

Tôi nghĩ rằng có một mẹo regexp để có được mã thông báo phù hợp của bạn để trở về là tốt, nhưng tôi đã đi 20 năm mà không học regexp và nó vẫn chưa bao giờ là câu trả lời tốt nhất cho bất kỳ vấn đề nào tôi đã giải quyết (Không phải là tôi sẽ thực sự biết vì tôi không bao giờ sử dụng nó, nhưng các giải pháp phi regexp thường quá dễ dàng để đánh bại.)

2

Tôi nghĩ rằng một StringTokenizer có thể hoạt động tốt hơn cho bạn, YMMV.

+0

Không sử dụng StringTokenizer xin vui lòng. Oracle đề xuất phương pháp 'split'. Đây là một phần của trang tài liệu StringTokenizer: 'StringTokenizer là lớp cũ được giữ lại vì lý do tương thích mặc dù việc sử dụng nó không được khuyến khích trong mã mới. Đó là khuyến cáo rằng bất cứ ai tìm kiếm chức năng này sử dụng phương pháp tách String hoặc gói java.util.regex thay thế.' –

4

Làm việc cho tôi.

class t { 
    public static void main(String[] _) { 
     String t1 = "value1:value2::value3"; 
     String[] t2 = t1.split(":"); 
     System.out.println("t2 has "+t2.length+" elements"); 
     for (String tt : t2) System.out.println("\""+tt+"\""); 
    } 
} 

cung cấp cho các đầu ra

$ java t 
t2 has 4 elements 
"value1" 
"value2" 
"" 
"value3" 
1

Sử dụng một giới hạn tiêu cực trong tuyên bố chia tay bạn:

String str = "val1:val2::val3"; 
String[] st = str.split(":", -1); 
for (int i = 0; i< st.length; i++) 
    System.out.println(st[i]); 

Kết quả:

val1 
val2 

val3 
1
public static void main(String[] args){ 
    String[] arr = "value1:value2::value3".split(":"); 
    for(String elm:arr){ 
    System.out.println("'"+elm+"',"); 
    } 
    System.out.println(arr.length); 
} 

in

'value1', 
'value2', 
'', 
'value3', 
4 

Đó là chính xác những gì bạn muốn. Sai lầm của bạn là ở một nơi khác ...

0

Điều đó sẽ hiệu quả nhưng hãy cung cấp cho StringTokenizer một lần nữa nếu bạn vẫn gặp sự cố.

1

Sử dụng Guava 's lớp Splitter:

Iterable<String> split = Splitter.on(':').split("value1:value2::value3"); 

Splitter không bỏ qua kết quả trống theo mặc định, mặc dù bạn có thể làm cho một trong đó không. Mặc dù có vẻ như từ những gì người khác đang nói rằng những gì bạn đang làm cũng nên làm việc.

0

này hoạt động,

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.File; 
import java.io.IOException; 

public class split { 
public static void main(String[] args) 
{ 
    String data = null; 
    try { 
    BufferedReader br = new BufferedReader(new FileReader(new File("split.csv"))); 
    while((data=br.readLine())!=null) 
    { 
     System.out.println("line:"+data); 
     String[] cols = data.split(":",-1); 
     System.out.println("count:"+cols.length); 
     for(int x=0;x<cols.length;++x) 
     { 
      System.out.println("["+x+"] =("+cols[x]+")"); 
     } 
    } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

Đây là một tập tin kiểm tra,

a:b:c:d:e 
a:b:c:d: 
a:b:c:: 
a:b::: 
a:::: 
:::: 
::::e 
:::d:e 
::c:d:e 
:b:c:d:e 
a:b:c:d:e 
Các vấn đề liên quan