[英]Java Scanner with empty delimiter
我想使用手寫降序解析器解析一些文本。 我將Scanner
與以下定界符一起使用: "\\\\s*"
。 不幸的是,此模式與空字符串匹配的事實似乎使每個hasNextFoo
和nextFoo
匹配。
該文檔沒有說任何可能為空的定界符。
您對“ +”字符有異議嗎?
您確定要使用正則表達式,而不僅僅是要測試空格字符的if語句嗎? 您說“運行時”。 您的數據是字符串還是流中的數據?
您可能還會考慮StreamTokenizer 。 這是在遞歸下降解析器中將其用於一個符號的超前查看的示例。
是的,因為我想將掃描儀用作運行時詞典。 簡而言之,我希望能夠問Scanner.next(pattern),它要么返回匹配的字符串,要么在不使用流的情況下返回異常。 空格應忽略。 如果有比掃描儀更好的方法,我將很高興使用它。
我想不出任何可以為您完成的現成的庫類。 掃描儀/詞典器的正常模型是,將使用任何無效的字符序列(即導致異常的序列)。 因此,我認為您將不得不手動實現自己的掃描儀,請小心將預讀字符視為未消費字符。 您可以使用“回推式”閱讀器或(如果該模型不方便)通過使用某種標記/重置模型自己顯式緩沖字符來完成此操作。 如果您要做的只是拆分成由一個或多個空格分隔的令牌,則后推閱讀器方法應該沒問題。
可以使用lookbehinds / lookaheads明確定義哪些定界符是可省略的。
例如,此掃描儀使用空格作為分隔符,但在數字和單詞之間不需要它們:
new Scanner("1A.23 4 BC-5")
.useDelimiter("\\s+|(?<=\\d)(?=[A-Z])|(?<=[A-Z])(?=[-+.\\d])");
它產生:
1
A
.23
4
BC
-5
正則表達式由三個替換組成:
\\s+
連續的空格是分隔符。 (?<=\\d)(?=[AZ])
數字和字母之間的空字符串是分隔符。 (?<=[AZ])(?=[-+.\\d])
字母與'-','+','。'之間的空字符串 或數字是分隔符。 (注意: \\w
在這里不能使用,因為它與數字匹配。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.