我想使用手寫降序解析器解析某些文本。我用以下分隔符Scanner
:"\\s*"
。不幸的是,這種模式匹配空字符串的事實似乎使每個hasNextFoo
和nextFoo
都不再匹配。帶空分隔符的Java掃描器
該文檔沒有提及可能爲空的分隔符。
我想使用手寫降序解析器解析某些文本。我用以下分隔符Scanner
:"\\s*"
。不幸的是,這種模式匹配空字符串的事實似乎使每個hasNextFoo
和nextFoo
都不再匹配。帶空分隔符的Java掃描器
該文檔沒有提及可能爲空的分隔符。
你對「+」字符有一些反對意見嗎?
是否確定要使用正則表達式,而不僅僅是測試空間字符的if語句?你說'運行時'。你的數據是字符串,還是來自一個流,或者什麼?
您可能還會考慮StreamTokenizer。這是一個在recursive-descent parser中將其用於一個符號預覽的示例。
是的,因爲我想用掃描儀作爲運行時間詞法分析器。簡而言之,我希望能夠詢問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)(?=[A-Z])
數字和字母之間的空字符串是分隔符。(注:\w
可以爲它匹配的數字不能在此處使用。)
可愛。我相信@bmargulies試圖說的是,+角色將匹配「至少一個」,「而不是一個或多個」。這將阻止它匹配一個空字符串。 – GrayWizardx 2009-12-25 23:21:51
是的,因爲我想用掃描儀作爲運行時間詞法分析器。總之,我想能夠問'掃描儀。next(pattern)',它會返回匹配的字符串,或者在不使用流的情況下返回異常。空間應該被忽略。如果比掃描儀有更好的課程,我會很樂意使用它。 – 2009-12-25 23:29:42
所有的開玩笑,@垃圾回答可能是想要的。你真的沒有給我們足夠的背景去繼續。 – bmargulies 2009-12-25 23:51:14