2015-04-21 35 views
8

Tôi muốn chia một chuỗi bằng dấu chấm phẩy (""):String.split bởi dấu chấm phẩy

String phrase = "‫;‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid"; 
String[] dateSplit = phrase.split(";"); 
System.out.println("dateSplit[0]:" + dateSplit[0]); 
System.out.println("dateSplit[1]:" + dateSplit[1]); 

Nhưng nó loại bỏ các ";" từ chuỗi và đặt tất cả chuỗi 'datesplit 1' nên sản lượng là:

dateSplit[0]:‫ 
dateSplit[1]:‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid` 

Demo

và làm

System.out.println("Real String :"+phrase); 

chuỗi in là

Real String :‫;‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid 
+11

Biến "cụm từ" của bạn không được định dạng chính xác. Hiển thị cho chúng tôi mã thực tế và chúng tôi có thể trợ giúp. – vdwijngaert

+0

khi bạn chia nhỏ với bất kỳ ký tự nào thì ký tự đó sẽ không nằm trong mảng của bạn. Ở đây nếu bạn muốn ';' sau đó bạn phải thêm thủ công sau dateSplit [0] + ";" – Pratik

+1

Tôi ngửi thấy vấn đề mã hóa có thể xảy ra ở đây. – Palcente

Trả lời

10

phrase chứa bi-directional characters như right-to-left embedding. Đó là lý do tại sao một số trình chỉnh sửa không quản lý hiển thị đúng chuỗi.

Đoạn mã này hiển thị các ký tự thực tế trong String (đối với một số người, phrase sẽ không hiển thị ở đây đúng cách, nhưng nó biên dịch và có vẻ tốt trong Eclipse). Tôi chỉ dịch trái-phải với ->, từ phải sang trái với <-pop hướng với ^:

public static void main(String[]args) { 
    String phrase = "‫;‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid"; 
    String[] dateSplit = phrase.split(";"); 
    for (String d : dateSplit) { 
     System.out.println(d); 
    } 
    char[] c = phrase.toCharArray(); 
    StringBuilder p = new StringBuilder(); 
    for (int i = 0; i < c.length;i++) { 
     int code = Character.codePointAt(c, i); 
     switch (code) { 
     case 8234: 
      p.append(" -> "); 
      break; 
     case 8235: 
      p.append(" <- "); 
      break; 
     case 8236: 
      p.append("^"); 
      break; 
     default: 
      p.append(c[i]); 
     } 
    } 
    System.out.println(p.toString()); 
} 

Prints:

< -; -> 14/5/2015^^ < - -> FC^^ < - -> Barcelona^^ < - -> VS.^^< - -> Bất động^^ < - -> Madrid

Các String#split() sẽ làm việc trên thực tế chuỗi nhân vật chứ không phải những gì hiển thị biên tập viên, do đó bạn sẽ nhìn thấy ; là nhân vật thứ hai sau một từ phải sang trái, mang đến cho (hãy cẩn thận của màn hình một lần nữa: các ; không phải là một phần của chuỗi trong dateSplit[1]):

dateSplit [0] = "";
dateSplit [1] = "14/5/2015 FC Barcelona VS. Real Madrid";

Tôi đoán bạn đang xử lý dữ liệu từ một ngôn ngữ viết/đọc từ phải sang trái và có một số kết hợp với tên nhóm bóng đá từ trái sang phải. Giải pháp chắc chắn là loại bỏ các ký tự định hướng và đặt ; vào đúng vị trí, tức là dấu tách cho mã thông báo.

1

tôi rewrote mã của bạn, thay vì đối phó từ đây và hoạt động của nó hoàn toàn tốt đẹp.

public static void main(String[] args) { 
    String phrase = "14/May/2015; FC Barcelona VS. Real Madrid"; 
    String[] dateSplit = phrase.split(";"); 
    System.out.println("dateSplit[0]:" + dateSplit[0]); 
    System.out.println("dateSplit[1]:" + dateSplit[1]); 
} 

Demo

+1

đây không phải là chuỗi OP được đăng – Palcente

+1

có một số ký tự ẩn trong chuỗi OP được đăng – Prashant

+0

@Palcente, Oh tôi hiểu, tôi nghĩ OP đang cố gắng với văn bản này được hiển thị trong câu hỏi. –

0

Cắt và dán mã của bạn vào IntelliJ hơi say lên biên tập viên; như @Palcente đã nói, các vấn đề mã hóa có thể xảy ra.

Tuy nhiên, tôi khuyên bạn nên sử dụng một StringTokenizer thay thế.

StringTokenizer sTok = new StringTokenizer(phrase, ";"); 

Sau đó bạn có thể lặp lại qua đó, dẫn đến mã đẹp hơn và an toàn hơn.

+2

Bạn nói: * "Tuy nhiên, tôi khuyên bạn nên sử dụng một StringTokenizer để thay thế. Bạn có thể lặp lại nó, dẫn đến mã đẹp hơn và an toàn hơn." *, [JavaDoc] (https://docs.oracle.com/ javase/7/docs/api/java/util/StringTokenizer.html) nói: * "StringTokenizer là một lớp kế thừa đượ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. Chúng tôi khuyên rằng bất kỳ ai tìm kiếm chức năng này đều sử dụng phương thức tách String hoặc gói java.util.regex. "*. Một người mới nên nghĩ gì về Java? : P – Tom

+0

@Tom hmm, đã không nhận thấy rằng, có lẽ bởi vì nó đã không được chú thích là không được chấp nhận (ngoài ra, tôi không thể nhớ lần cuối cùng tôi thực sự sử dụng một StringTokenizer). Tốt để biết. –

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