在您的模式中,您需要逗号或行尾组合。这里最好的事情是有一个交替的非捕获组。如果您不必考虑 CRLF 组合,则字符类可能会起作用,但这并不总是一个好的假设。
这是一个例子。我正在使用 Clojure 来驱动 Java API,如果您花一点时间看一下它,您应该能够了解要点,即使您不熟悉 Clojure。分号后面的位是注释。
; define a function that will return a scanner on user input
; with a given pattern
user=> (defn scanner [input delimiter]
(-> (java.util.Scanner. input) (.useDelimiter delimiter)))
#'user/scanner
; define the input
user=> (def input "Thomson,Alfred,NY,00192838,USA\nVincent,Ramblè,PA,0033928283,FRANCE")
#'user/input
; create the scanner
; (:?) is a non capturing group
; the | in the middle tells the group to look for a or b
; first alternative is a comma
; second alternative is a newline followed by 0 or 1
; carriage returns.
; The javadoc for the java.util.Pattern class really helps
user=> (def myscanner (scanner input "(:?,|\n\r?)"))
#'user/myscanner
; quick/dirty way to call next on the scanner 10 times and print
; the result of each call
user=> (dotimes [n 10] (println (.next myscanner)))
Thomson
Alfred
NY
00192838
USA
Vincent
Ramblè
PA
0033928283
FRANCE
但是,如果你真的想做 CSV,这个问题已经解决了很多次了。有很多库可以处理 CSV 的一些古怪部分。例如http://commons.apache.org/proper/commons-csv(这只是一个例子——你应该在使用前评估它)。
祝你好运!