我承认,不是最好的标题。
我遇到了以下问题。我需要使用我的扫描仪并解析每个单词(没有分隔符(以分隔字符串。
示例:Poker; Blackjack; LasVegas, NewYork
到Poker
Blackjack
LasVegas
NewYork
现在,对于第一部分,我只使用这样的分隔符:sc.useDelimiter("; ")
可以正常工作。
第二部分是我遇到麻烦的地方。如果我在使用完二十一点后切换到sc.useDelimiter(", ")
,我仍然会包含第一个;
和一个空格,以便字符串输出; LasVegas
。
我尝试通过首先重置分隔符并吃掉第一个令牌来检查它,这是一种糟糕的解决方法,但随后字符串仍然会变成"whitespace"LasVegas
而不是LasVegas
。
真的很感激一些帮助。
有多种方法可以解决这个问题,具体取决于您的实际要求1:
- 不要更改分隔符。
"Blackjack"
后的令牌将被"LasVegas, NewYork to Poker Blackjack LasVegas NewYork"
。 创建另一个扫描程序来分析该令牌。 (或使用String::split
。 - 使用可以匹配任一分隔符的分隔符正则表达式;例如
"[;,]\s*"
. 像这样解析:
String line = scanner.nextLine(); String[] parts = line.split(";\s*"); String[] parts2 = parts[2].split(",\s*");
这是假设
;
是主分隔符,,
是辅助分隔符。更改输入文件语法,使其仅使用一个分隔符。 (这假设您可以自由地这样做,并且替代语法将"更有意义"。
1 - 显然,我们无法从一行输入中推断出您尝试解析的文件的语法。 或者,通常,来自单个示例输入文件。
使用正则表达式匹配两种类型的标点符号,包括任何尾随空格,应该可以解决问题。
sc.useDelimiter("[;,]\s*");
^^^^ Followed by 0 or more whitespace chars
^^^^ Either of these
如果最后一个标记后面没有分号或逗号,这将无法捕获最后一个标记(在本例中为NewYork
(。如果这些 4 元组的游戏和城市采用这种格式(最后一个标记之后没有分隔符(,那么您可以另外匹配换行符:
sc.useDelimiter("\n|[;,]\s*");
^^^^^^^^ semi/comma delimiters
^ OR
^^^ New-line character