2010-03-03 63 views
0

我試圖找到一種很好的方法來讓掃描程序使用給定的分隔符作爲標記。例如,我想將一段文本拆分爲數字和非數字塊,所以理想情況下,我只需將分隔符設置爲\D並設置一些標誌,如useDelimiterAsToken,但在簡要查看API後,我將沒有提出任何事情。現在,我不得不求助於使用組合向前看符號/ lookbehinds的分隔符,這是有點痛苦:Java:使用掃描器分隔符作爲標記

scanner.useDelimiter("((?<=\\d)(?=\\D)|(?<=\\D)(?=\\d))"); 

這看起來從一個數字,非數字或反之亦然任何過渡。有沒有更健全的方式來做到這一點?

+0

請參閱:http://stackoverflow.com/questions/2206378/how-to-split-a-string-but-also-keep-the-delimiters,也許它有幫助。 – 2010-03-03 11:53:11

+0

問題是,如果我爲'\ d'或'\ d +'做了同樣的事情,它會在太多的地方匹配 – daltonb 2010-03-03 12:16:58

回答

1

編輯:編輯的問題是如此不同,我原來的答案根本不適用。爲了記錄,你在做什麼解決你的問題的理想方式,在我看來。您的分隔符是數字與非數字之間的零寬度邊界,並且沒有比您發佈的內容更簡潔的表達方式。

EDIT2:(針對在註釋中提出的問題。)您最初問這個的替代正則表達式:

"((?<=\\w)(?=[^\\w])|(?<=[^\\w])(?=\\w))" 

這幾乎是究竟如何\b,字邊界構造,工作原理:

"(?<=\\w)(?!\\w)|(?<!\\w)(?=\\w)" 

也就是說,位置的前面是一個單詞字符,後面跟一個單詞,後面跟一個單詞字符,前面沒有一個單詞。區別在於\b可以在輸入的開始和結束處匹配。你顯然不希望出現這種情況,所以我加了lookarounds排除這些條件:

"(?!^)\\b(?!$)" 

這只是一個更簡潔的方式做你的正則表達式做了什麼。但是後來您將要求更改爲匹配數字/非數字邊界,並且對於單詞/非單詞邊界不存在像\b那樣的簡寫。

+0

它們已經在我正在使用的正則表達式中被阻止了。 – daltonb 2010-03-03 12:03:55

+0

我知道,我只是建議使用較短的正則表達式來完成同樣的事情。但是你改變了要求,所以現在不相關。 – 2010-03-03 12:10:36

+0

對於您的解決方案在第一種情況下的幫助,我仍然有點困惑。現在,除了數字而不是單詞外,現在的問題是相同的。我只是不希望單詞邊界成爲一個選項,因爲我實際上正在做一些更復雜的事情。 – daltonb 2010-03-03 12:12:34