簡體   English   中英

帶有空定界符的Java掃描儀

[英]Java Scanner with empty delimiter

我想使用手寫降序解析器解析一些文本。 我將Scanner與以下定界符一起使用: "\\\\s*" 不幸的是,此模式與空字符串匹配的事實似乎使每個hasNextFoonextFoo匹配。

該文檔沒有說任何可能為空的定界符。

您對“ +”字符有異議嗎?

您確定要使用正則表達式,而不僅僅是要測試空格字符的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.

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