如何从扫描仪中删除分隔符恢复器?(爪哇)



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

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

示例:Poker; Blackjack; LasVegas, NewYorkPokerBlackjackLasVegasNewYork

现在,对于第一部分,我只使用这样的分隔符:sc.useDelimiter("; ")可以正常工作。

第二部分是我遇到麻烦的地方。如果我在使用完二十一点后切换到sc.useDelimiter(", "),我仍然会包含第一个;和一个空格,以便字符串输出; LasVegas

我尝试通过首先重置分隔符并吃掉第一个令牌来检查它,这是一种糟糕的解决方法,但随后字符串仍然会变成"whitespace"LasVegas而不是LasVegas

真的很感激一些帮助。

有多种方法可以解决这个问题,具体取决于您的实际要求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. 更改输入文件语法,使其仅使用一个分隔符。 (这假设您可以自由地这样做,并且替代语法将"更有意义"。


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

最新更新