如何从扫描仪中删除定界符恢复? (Java)
How do I remove delimiter restovers from a scanner? (Java)
我承认,不是最好的标题。
我遇到了以下问题。我需要使用我的扫描仪并解析每个单词(没有分隔符)以分隔字符串。
示例:Poker; Blackjack; LasVegas, NewYork
到 Poker
Blackjack
LasVegas
NewYork
现在,对于第一部分,我只使用像这样的分隔符:sc.useDelimiter("; ")
这样就可以了。
第二部分是我遇到麻烦的地方。如果我在完成 Blackjack 后切换到 sc.useDelimiter(", ")
,我仍然会包含第一个 ;
和一个空格,这样字符串将输出 ; LasVegas
.
我尝试通过首先重置定界符并吃掉第一个标记来解决它,这是一种不好的解决方法,但随后字符串仍然会变成 "whitespace"LasVegas
而不是 LasVegas
.
非常感谢您的帮助。
使用正则表达式来匹配两种类型的标点符号,包括任何尾随空格,应该可以解决问题。
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
有多种方法可以解决这个问题,具体取决于您的实际需求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*");
这是假设 ;
是主要分隔符,,
是辅助分隔符。
更改输入文件语法,使其仅使用一个分隔符。 (这假定您可以自由地这样做,并且替代语法将 "make more sense"。)
1 - 显然,我们无法从单行输入中推断出您尝试解析的文件的语法。或者,一般来说,来自单个示例输入文件。
我承认,不是最好的标题。
我遇到了以下问题。我需要使用我的扫描仪并解析每个单词(没有分隔符)以分隔字符串。
示例:Poker; Blackjack; LasVegas, NewYork
到 Poker
Blackjack
LasVegas
NewYork
现在,对于第一部分,我只使用像这样的分隔符:sc.useDelimiter("; ")
这样就可以了。
第二部分是我遇到麻烦的地方。如果我在完成 Blackjack 后切换到 sc.useDelimiter(", ")
,我仍然会包含第一个 ;
和一个空格,这样字符串将输出 ; LasVegas
.
我尝试通过首先重置定界符并吃掉第一个标记来解决它,这是一种不好的解决方法,但随后字符串仍然会变成 "whitespace"LasVegas
而不是 LasVegas
.
非常感谢您的帮助。
使用正则表达式来匹配两种类型的标点符号,包括任何尾随空格,应该可以解决问题。
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
有多种方法可以解决这个问题,具体取决于您的实际需求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*");
这是假设
;
是主要分隔符,,
是辅助分隔符。更改输入文件语法,使其仅使用一个分隔符。 (这假定您可以自由地这样做,并且替代语法将 "make more sense"。)
1 - 显然,我们无法从单行输入中推断出您尝试解析的文件的语法。或者,一般来说,来自单个示例输入文件。