2009-12-25 112 views
1

我想使用手寫降序解析器解析某些文本。我用以下分隔符Scanner"\\s*"。不幸的是,這種模式匹配空字符串的事實似乎使每個hasNextFoonextFoo都不再匹配。帶空分隔符的Java掃描器

該文檔沒有提及可能爲空的分隔符。

回答

1

你對「+」字符有一些反對意見嗎?

是否確定要使用正則表達式,而不僅僅是測試空間字符的if語句?你說'運行時'。你的數據是字符串,還是來自一個流,或者什麼?

+0

可愛。我相信@bmargulies試圖說的是,+角色將匹配「至少一個」,「而不是一個或多個」。這將阻止它匹配一個空字符串。 – GrayWizardx 2009-12-25 23:21:51

+0

是的,因爲我想用掃描儀作爲運行時間詞法分析器。總之,我想能夠問'掃描儀。next(pattern)',它會返回匹配的字符串,或者在不使用流的情況下返回異常。空間應該被忽略。如果比掃描儀有更好的課程,我會很樂意使用它。 – 2009-12-25 23:29:42

+0

所有的開玩笑,@垃圾回答可能是想要的。你真的沒有給我們足夠的背景去繼續。 – bmargulies 2009-12-25 23:51:14

1

是的,因爲我想用掃描儀作爲運行時間詞法分析器。簡而言之,我希望能夠詢問scanner.next(pattern),它將返回匹配的字符串,或者在不使用流的情況下返回異常。空間應該被忽略。如果比掃描儀有更好的課程,我會很樂意使用它。

我想不出任何現成的庫類會爲你做到這一點。掃描儀/詞法分析器的普通模型是任何無效的字符序列(即導致異常的字符序列)都將被消耗。所以,我認爲你將不得不親自實施自己的掃描儀,注意將未讀的字符視爲未消耗的字符。你可以用一個「回推」閱讀器或者(如果這個模型不方便)通過用某種標記/重置模型自己明確緩衝字符來做到這一點。如果你正在做的是分裂成一個或多個空格分隔的令牌,那麼推回閱讀器的方法應該沒問題。

0

可以使用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可以爲它匹配的數字不能在此處使用。)