如何从扫描仪中删除定界符恢复? (Java)

How do I remove delimiter restovers from a scanner? (Java)

我承认,不是最好的标题。

我遇到了以下问题。我需要使用我的扫描仪并解析每个单词(没有分隔符)以分隔字符串。

示例:Poker; Blackjack; LasVegas, NewYorkPoker 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:

  1. 不要更改分隔符。 "Blackjack" 之后的标记将是 "LasVegas, NewYork to Poker Blackjack LasVegas NewYork"。创建另一个扫描器来解析该令牌。 (或使用 String::split。)
  2. 使用可以匹配任一定界符的定界符正则表达式;例如"[;,]\s*".
  3. 像这样解析:

     String line = scanner.nextLine();
     String[] parts = line.split(";\s*");
     String[] parts2 = parts[2].split(",\s*");
    

    这是假设 ; 是主要分隔符,, 是辅助分隔符。

  4. 更改输入文件语法,使其仅使用一个分隔符。 (这假定您可以自由地这样做,并且替代语法将 "make more sense"。)


1 - 显然,我们无法从单行输入中推断出您尝试解析的文件的语法。或者,一般来说,来自单个示例输入文件。