2009-08-16 40 views
1

我已經構建了一個正則表達式,我編譯爲模式來查找Fortran Real * 8數字。棘手的一點是,我從閱讀該文件是用幾百萬列..單行 當我這樣做:麻煩/被Java.util.Scanner的下一個(模式)方法困惑

Scanner recordScanner = new Scanner(recordString); 
String foundReal = recordScanner.findInLine(real8Regex); 

我得到了我要找的,但是當我使用next(Pattern)方法,我得到一個InputMismatchException ..奇怪,考慮到findInLine和下一個返回字符串。

Scanner recordScanner = new Scanner(recordString); 
String foundReal = recordScanner.next(real8Regex); 

我在使用next()方法時缺少一些至關重要的東西嗎?

回答

3

這是「不是所有的令牌都符合該模式,因此next(Pattern)卡在第一個不匹配的令牌」問題?

next(Pattern)可以使用這樣的:

String toSearch = "ab123d4e::g67f912g34h"; 
Scanner aScanner = new Scanner(toSearch); 
aScanner.useDelimiter("[a-z]+"); 
while (aScanner.hasNext("[0-9]+")) 
{ 
    System.out.println(aScanner.next("[0-9]+")); 
} 

但只會輸出123和4作爲非匹配的第三令牌使while循環終止。但是,在這種情況下,我應該只使用hasNext()next()

我很努力地想到一個真正的理由,因爲它會卡住第一個不符合該模式的標記,因此永遠使用next(Pattern)next(Pattern)確實不是的意思是「返回匹配模式的當前位置之後的第一個標記」;它的意思是「返回下一個標記序列中,如果它匹配模式;否則,什麼都不做」

你(大概)需要讀取所有的令牌,從而將更好地使用hasNext()next()然後用Matcher反對所需Pattern每個令牌

最後,你會發現question 842496有用

2

在我看來,文檔不是出色的書面,但它正在做它的意義。

next(pattern)被記錄爲返回令牌如果它在掃描儀的當前位置找到。如果模式在當前行中不匹配,則findInLine(pattern)被記錄爲返回null

首先檢查,在致電next(pattern)之前使用hasNext(pattern)

+0

感謝您的迴應,當我嘗試使用hasNext(模式)時,應用程序找不到任何東西... 如果我將if(hasNext(Pattern))條件包含在Scanner的while循環中。hasNext()(如果有另一個基於我的分隔符的記號(它是空格),則該代碼只是吃CPU週期,但從不返回結果。 – sbook 2009-08-16 21:15:22

+1

是的,因爲hasNext不會推進掃描儀。我不清楚你真正想要達到什麼。一些示例代碼會有所幫助。 – 2009-08-16 22:22:13

1

我有點晚了(你應該標記爲「正則表達式」),但你應該使用

String foundReal = recordScanner.findWithinHorizon(real8Regex, 0); 

通過使用findInline(real8Regex),您可以使掃描儀進行大量不必要的處理,以確保當前匹配與最後一條匹配。您的數據全部在一行的事實正是您爲什麼不應使用使用findInLine()