簡體   English   中英

Java Scanner Dilimiter

[英]Java Scanner Dilimiter

我正在使用Scanner和Delimiter來標記我的.txt文件(這是我必須做的功課)。 該文件的第一個版本如下所示:

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

我已經使用了useDelimiter("[ ]*(,)[ ]*")該文件的第二個版本如下所示:

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

我無法想出一個正則表達式,它可以幫助我用空格和單詞用逗號分隔數字。 基本上我需要一個包含14個值的數組(非常好的是單個變量)

請注意,有多個空格(這是為了讓我們更難以實現)。

所以任何形式的幫助將不勝感激。

PS我們只允許使用分隔符 (沒有分割等...)

這應該工作,關鍵是正面看( (<?=) )和交替( | ):

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() + ".");
}

打印:

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-9]+)\\s*(?=[0-9]+))|(,\\s*(?=[a-zA-Z]+))|((?<=[0-9]+)\\s*(?=[a-zA-Z]+))) ,看起來很糟糕但應該工作

請注意, Scanner允許您隨時更改分隔符。 如果你可以依賴你的輸入文本,開頭總共有10個數字,最后有4個單詞組,那么你可以簡單地從一個分隔符開始,只需要分隔空格( \\s+ )和10個調用nextInt() ,切換分隔逗號和空格( \\s*,\\s* )的分隔符。

就像是:

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;
}

使用零寬度環繞聲斷言 ,也可以使用單個分隔符正則表達式執行此操作,但對於簡單的作業問題,這可能有點高級。

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

嘗試這個:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM