2011-12-17 39 views
5

Tôi cố gắng để phá vỡ một bộ sưu tập rất đơn giản các chuỗi có sẵn trong các hình thứcchuỗi tách dựa trên một delimiter

0|0 
10|15 
30|55 

vv vv Về cơ bản số đó được tách ra bởi ống.

Khi tôi sử dụng chức năng chia chuỗi của java với .split ("|"). Tôi nhận được một số kết quả không thể đoán trước. khoảng trắng trong khe đầu tiên, đôi khi con số chính nó không phải là nơi tôi nghĩ nó nên được.

Ai đó có thể vui lòng giúp đỡ và cho tôi lời khuyên về cách tôi có thể sử dụng điểm kinh nghiệm reg để giữ CHỈ số nguyên không?

Tôi được yêu cầu cung cấp mã cố gắng thực hiện chia tách thực tế. Vì vậy, cho phép tôi làm điều đó với hy vọng làm rõ hơn nữa vấn đề của tôi :)

String temp = "0|0"; 
String splitString = temp.split("|"); 

kết quả

\n 
0 
| 
0 

tôi đang cố gắng để có được

0 
0 
chỉ

. Vô cùng biết ơn vì bất kỳ sự giúp đỡ nào trước thời hạn :)

+0

Sử dụng' .split' sẽ là cách dễ nhất, nếu họ luôn được phân định Thay vì cố gắng làm điều này với regex, bạn có thể đăng đoạn mã bạn đã viết cố gắng thực hiện phân chia cùng với đầu ra hay không (không chỉ mô tả đầu ra, cho chúng ta thấy đầu ra) – jefflunt

+0

Đăng một số mã lý tưởng là một ví dụ tối thiểu để chứng minh vấn đề này – crazyscot

+0

Tôi đã đăng hai dòng mã cho tôi vấn đề này. Cảm ơn bạn đã nhắc tôi đăng bài này –

Trả lời

7

tôi vẫn đề nghị sử dụng split(), nó sẽ bỏ qua thẻ rỗng theo mặc định. bạn muốn loại bỏ các ký tự không phải số trong chuỗi và chỉ giữ các đường ống và số, sau đó bạn có thể dễ dàng sử dụng split() để có được những gì bạn muốn. hoặc bạn có thể vượt qua nhiều delimiters chia (theo mẫu của regex) và điều này sẽ làm việc:

String[] splited = yourString.split("[\\|\\s]+"); 

và regex:

import java.util.regex.*; 

Pattern pattern = Pattern.compile("\\d+(?=([\\|\\s\\r\\n]))"); 
Matcher matcher = pattern.matcher(yourString); 
while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 
+0

điều này thực sự trái ngược với những gì tôi muốn làm haha! Ngoài ra đặt reg này cũ trong ide java của tôi (net đậu) nó mang lại cho tôi một lỗi ký tự thoát bất hợp pháp (tôi thậm chí không biết bạn có thể nhận được lỗi này bên trong một chuỗi ...). Bạn có thể cho tôi biết làm thế nào để giữ chỉ số nguyên? –

+0

@ SelcukBor oops, tôi quên thoát khỏi các dấu gạch chéo ngược. (vấn đề đăng mã mà không cần kiểm tra). Đã chỉnh sửa câu trả lời của tôi. – fardjad

+0

điều này đã làm các trick:) !!! Cảm ơn bạn rất nhiều vì đã cứu tôi trong giờ tối này. Ngoài ra như bình luận trong câu trả lời khác, có vẻ như chúng tôi cần hai ký tự thoát. Vì vậy, nó nên được chia nhỏ. ("[\\ | \\ s] +"); –

4

Bạn có thể thay thế khoảng trắng cho đường ống và chia tách nó.

String test = "0|0 10|15 30|55"; 
test = test.replace(" ", "|"); 
String[] result = test.split("|"); 

Hope this helps cho bạn ..

+0

như trên , nhưng nếu bạn cần giữ chúng theo cặp thì hãy sử dụng erent char e.g. Kiểm tra chuỗi = "0: 0 | 10: 15 | 30: 55"; sau đó tạo ra một vòng lặp để đi qua các cặp và chia những người vào mảng mới của bạn – Ozzy

+0

yeah, quan sát tốt đẹp –

0

này nên làm việc cho bạn:

([0-9]+) 
+0

này được loại bỏ các số nguyên? Tôi chỉ muốn giữ họ XD! –

+0

Bạn sẽ sử dụng điều này trong 'Pattern.compile()' nếu bạn muốn sử dụng regexp để khớp các chữ số trong chuỗi. – crazyscot

2

Các ống ('|') là một nhân vật đặc biệt trong regular expressions . Nó cần phải được "thoát" với ký tự '\' nếu bạn muốn sử dụng nó như một ký tự thông thường, thật không may '\' là một ký tự đặc biệt trong Java, do đó bạn cần thực hiện một kiểu thao tác thoát kép, ví dụ:

String temp = "0|0"; 
String[] splitStrings = temp.split("\\|"); 
6

Biểu tượng đường ống đặc biệt trong regexp (nó đánh dấu lựa chọn thay thế), bạn cần phải thoát khỏi nó. Tùy thuộc vào phiên bản java bạn đang sử dụng này cũng có thể giải thích kết quả không thể đoán trước của bạn.

class t { 
    public static void main(String[]_) 
    { 
     String temp = "0|0"; 
     String[] splitString = temp.split("\\|"); 

     for (int i=0; i<splitString.length; i++) 
      System.out.println("splitString["+i+"] is " + splitString[i]); 
    }  
} 

đầu ra

splitString[0] is 0 
splitString[1] is 0 

Lưu ý rằng một dấu chéo ngược là các ký tự thoát regexp, nhưng vì một dấu gạch chéo cũng là nhân vật thoát trong nguồn java bạn cần hai trong số họ để đẩy xuyệc ngược vào regexp.

+0

rất hữu ích khi biết về các biểu tượng đặc biệt. Nó giúp giải quyết vấn đề rất nhiều. Cảm ơn bạn cho đầu vào của bạn :) –

2

Thư viện Guava có lớp học đẹp Splitter là giải pháp thay thế thuận tiện hơn nhiều cho String.split(). Những lợi thế là bạn có thể chọn chia chuỗi trên các ký tự cụ thể (như '|'), hoặc trên các chuỗi cụ thể, hoặc với regexps và bạn có thể chọn phải làm gì với các phần kết quả (cắt chúng, ném phần trống rỗng, v.v ... .).

Ví dụ, bạn có thể gọi

Iterable<String> parts = Spliter.on('|').trimResults().omitEmptyStrings().split("0|0") 
+0

trong khi tôi đánh giá cao những người đứng đầu lên Tôi không mong muốn thử và nhận được một thư viện bên thứ ba bên trong dự án haha!Mọi thứ trở nên khó khăn để đón nhận như bây giờ. Tôi sẽ đánh dấu điều này để sử dụng trong tương lai. –

+1

Tôi có thể hiểu điều này, nhưng hãy yên tâm rằng Guava là một thư viện thực sự hữu ích giúp việc lập trình bằng Java thuận tiện hơn trong nhiều trường hợp. Vì vậy, bạn chắc chắn nên xem xét nó khi bạn có một số thời gian rảnh rỗi. –

+0

Hãy suy nghĩ về ổi trong cùng danh mục với Apache Commons. Nó cung cấp một số chức năng cơ bản thực sự hữu ích. –

3

Bạn có thể sử dụng StringTokenizer.

String test = "0|0"; 
StringTokenizer st = new StringTokenizer(test); 
int firstNumber = Integer.parseInt(st.nextToken()); //will parse out the first number 
int secondNumber = Integer.parseInt(st.nextToken()); //will parse out the second number 

Tất nhiên bạn luôn có thể lồng vòng lặp trong này nếu bạn có nhiều chuỗi.

Ngoài ra, bạn cần nhập java.util. * Để làm việc này.

0

Xem xét một trường hợp trong đó chúng tôi đã đọc một dòng từ tệp csv hoặc xls dưới dạng chuỗi và cần tách riêng các cột trong mảng chuỗi tùy thuộc vào dấu phân tách.

Dưới đây là đoạn mã để đạt được vấn đề này ..

  
    { ... 
    .... 
    String line = new BufferedReader(new FileReader("your file")); 
    String[] splittedString = StringSplitToArray(stringLine,"\""); 
    ... 
    .... 
    } 
    public static String[] StringSplitToArray(String stringToSplit, String delimiter) 
    { 
     StringBuffer token = new StringBuffer(); 
     Vector tokens = new Vector(); 
     char[] chars = stringToSplit.toCharArray(); 
     for (int i=0; i 0) { 
       tokens.addElement(token.toString()); 
       token.setLength(0); 
       i++; 
     } 
     } else { 
       token.append(chars[i]); 
      } 
     } 
     if (token.length() > 0) { 
      tokens.addElement(token.toString()); 
     } 
     // convert the vector into an array 
     String[] preparedArray = new String[tokens.size()]; 
     for (int i=0; i < preparedArray.length; i++) { 
      preparedArray[i] = (String)tokens.elementAt(i); 
     } 
     return preparedArray; 
    } 

Trên đoạn mã chứa lời gọi phương thức để StringSplitToArray nơi trong phương pháp chuyển đổi stringline vào mảng chuỗi tách dòng tùy thuộc vào các dấu phân cách chi tiết hoặc thông qua cho phương pháp. Delimiter có thể dấu phẩy phân cách (,) hoặc mã kép (")

Để biết thêm về vấn đề này, hãy làm theo này link:. http://scrapillars.blogspot.in

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