2013-02-21 33 views
5

Tôi đang sử dụng Máy quét và Dấu phân cách để mã hóa tệp .txt của tôi (đây là bài tập về nhà mà tôi phải làm). Phiên bản đầu tiên của tập tin trông như thế này:Máy quét Java Dilimiter

5,5,5,6,5,8,9,5,6,8, good, very good, excellent, good 
7,7,8,7,6,7,8,8,9,7,very good, Good, excellent, very good 
8,7,6,7,8,7,5,6,8,7 ,GOOD, VERY GOOD, GOOD, AVERAGE 
9,9,9,8,9,7,9,8,9,9 ,Excellent, very good, very good, excellent 
7,8,8,7,8,7,8,9,6,8 ,very good, good, excellent, excellent 
6,5,6,4,5,6,5,6,6,6 ,good, average, good, good 
7,8,7,7,6,8,7,8,6,6 ,good, very good, good, very good 
5,7,6,7,6,7,6,7,7,7 ,excellent, very good, very good, very good 

Và tôi đã sử dụng useDelimiter("[ ]*(,)[ ]*") phiên bản thứ hai của tập tin trông như thế này:

5 5 5 6 5 8 9 5 6 8 good, very good, excellent, good 
7 7 8 7 6 7 8 8 9 7 very good, Good, excellent, very good 
8 7 6 7 8 7 5 6 8 7 GOOD, VERY GOOD, GOOD, AVERAGE 
9 9 9 8 9 7 9 8 9 9 Excellent, very good, very good, excellent 
7 8 8 7 8 7 8 9 6 8 very good, good, excellent, excellent 
6 5 6 4 5 6 5 6 6 6 good, average, good, good 
7 8 7 7 6 8 7 8 6 6 good, very good, good, very good 
5 7 6 7 6 7 6 7 7 7 excellent, very good, very good, very good 

Và tôi không thể đưa ra một regexp mà sẽ giúp tôi phân tách các số bằng dấu cách và các từ bằng dấu phẩy. Về cơ bản, tôi cần một mảng với 14 giá trị (rất tốt là một biến duy nhất)

Lưu ý có nhiều khoảng trống (điều này được thực hiện nhằm mục đích làm cho chúng ta khó khăn hơn).

Vì vậy, mọi loại trợ giúp sẽ được đánh giá cao.

P.S. Chúng tôi chỉ được phép sử dụng ký tự phân cách chỉ (không chia tách vv ..)

+0

Có 'không gian' (\ s) và ' các lớp ký tự từ '(\ w) và' digit '(\ d) và' word boundary '(\ b) cho regex có thể giúp bạn. –

+0

Bạn có muốn dấu phẩy giữa số cuối cùng và từ đầu tiên không? – nattyddubbs

+0

Tôi không cần thêm bất kỳ thứ gì vào tệp, tôi chỉ cần trích xuất các giá trị và đặt chúng vào một mảng đa chiều trong trường hợp này, nó sẽ là [8] [14], các từ sẽ được thay thế bằng các số thích hợp. –

Trả lời

4

này nên làm việc, quan trọng là tích cực-lookbehind ((<?=)) và thay đổi luân phiên (|):

String input = "9 9 9 8 9 7 9 8 9 9 Excellent, very good, very good, excellent"; 
Scanner s = new Scanner(input).useDelimiter("(?<=\\d)[\\s,]+|\\s*,\\s*"); 
while (s.hasNext()) { 
    System.out.println("Token: ." + s.next() + "."); 
} 

Prints:

Token: .9. 
Token: .9. 
Token: .9. 
Token: .8. 
Token: .9. 
Token: .7. 
Token: .9. 
Token: .8. 
Token: .9. 
Token: .9. 
Token: .Excellent. 
Token: .very good. 
Token: .very good. 
Token: .excellent. 
+0

Hoàn hảo, cảm ơn rất nhiều. –

2

Bạn có thể thử cái này (((?<=[0-9]+)\s*(?=[0-9]+))|(,\s*(?=[a-zA-Z]+))|((?<=[0-9]+)\s*(?=[a-zA-Z]+))), trông khủng khiếp nhưng nên làm việc

+0

Thứ nhất, đó là sai. Tôi đoán bạn có nghĩa là '(\ s *, \ s *) | (\ s +)'. Nhưng điều đó cũng không hiệu quả. Nó sẽ tách biệt 'rất tốt 'thành hai thẻ. – Alderath

+0

Số dường như không sao, nhưng các chuỗi chỉ chứa 1 chữ cái. –

+0

biến thể ban đầu được cập nhật, điều này sẽ đạt được mục tiêu –

0
String[] str = expression.split("(,\\s+)|(\\s+)"); 

Hãy thử điều này:

+0

Một lần nữa rất tốt được chia thành các thẻ riêng biệt, nơi nó được coi là một duy nhất. –

2

Lưu ý rằng Scanner cho phép bạn thay đổi dấu phân cách bất kỳ lúc nào. Nếu bạn có thể dựa vào văn bản đầu vào của bạn luôn có 10 số ở đầu và 4 nhóm từ ở cuối, thì bạn có thể bắt đầu với dấu phân cách chỉ tách trên dấu cách (\s+) và sau 10 cuộc gọi đến nextInt(), chuyển sang dấu phân cách chia tách trên dấu phẩy và dấu cách (\s*,\s*).

Cái gì như:

String input = "5 5 5 6 5 8 9 5 6 8 good, very good, excellent, good"; 
Scanner scanner = new Scanner(input).useDelimiter("\\s+"); 
int[] results = new int[14]; 
for (int i = 0; i < 10; ++i) { 
    results[i] = scanner.nextInt(); 
} 
scanner.useDelimiter("\\s*,\\s*"); 
scanner.skip("\\s*"); 
for (int i = 10; i < 14; ++i) { 
    String wordPhrase = scanner.next(); 
    int wordValue; 
    if ("average".equalsIgnoreCase(wordPhrase)) 
     wordValue = 1; 
    else if ("good".equalsIgnoreCase(wordPhrase)) 
     wordValue = 2; 
    else if ("very good".equalsIgnoreCase(wordPhrase)) 
     wordValue = 3; 
    else if ("excellent".equalsIgnoreCase(wordPhrase)) 
     wordValue = 4; 
    else 
     wordValue = 0; 
    results[i] = wordValue; 
} 

Nó cũng có thể làm điều này với một regex delimiter đơn sử dụng zero-width lookaround assertions, nhưng điều này có lẽ là một chút cải tiến cho một vấn đề bài tập đơn giản.

+0

Cảm ơn bạn đã gợi ý, tại sao tôi không nghĩ về điều đó trước đây :) Tôi có vấn đề tho, chỉ số thứ 10 luôn có vẻ là 0. –

+0

Ah, tôi đoán khi bạn chuyển dấu phân tách, 'Máy quét' không không tiêu thụ (các) khoảng trắng giữa số cuối cùng và từ đầu tiên, do đó, nó sẽ có thứ gì đó như "' good' "cho cụm từ đầu tiên. Tôi đã cập nhật câu trả lời để báo cho 'Máy quét' bỏ qua khoảng trống sau khi thay đổi dấu phân tách. – matts

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