当前位置: 首页 > 知识库问答 >
问题:

Java扫描器-除非有引号,否则按空格分隔?

洪国兴
2023-03-14

我试图使用Java中的Scanner类从配置文件中获取数据。文件的元素由空格分隔。但是,如果短语或元素应解释为字符串文字(包括空格),则双引号或单引号位于元素周围。这将生成如下所示的文件:

> R 120 Something AWord

> P 160 SomethingElse "A string literal"

在使用Java Scanner类时,默认情况下,它仅以空格分隔。Scanner类具有useDelimiter()函数,该函数使用正则表达式为文本指定不同的分隔符。然而,我不擅长正则表达式,所以我不确定该怎么做。

除非有引号围绕某个东西,否则如何用空格分隔?

共有1个答案

毋胜涝
2023-03-14

您可以使用扫描仪。findInLine(pattern)方法,指定要防止拆分字符串文本。您只需要一个正则表达式,它将匹配无引号标记或引号中的标记。这一个可能有效:

"[^\"\\s]+|\"(\\\\.|[^\\\\\"])*\""

(该正则表达式非常复杂,因为它在字符串文本中处理转义。)

示例:

String rx = "[^\"\\s]+|\"(\\\\.|[^\\\\\"])*\"";
Scanner scanner = new Scanner("P 160 SomethingElse \"A string literal\" end");
System.out.println(scanner.findInLine(rx)); // => P
System.out.println(scanner.findInLine(rx)); // => 160
System.out.println(scanner.findInLine(rx)); // => SomethingElse
System.out.println(scanner.findInLine(rx)); // => "A string literal"
System.out.println(scanner.findInLine(rx)); // => end

顾名思义,findInLine方法只能在当前行中工作。如果要搜索整个输入,可以使用findWithinHorizon。您可以将0作为地平线传入,告诉它使用无限地平线:

scanner.findWithinHorizon(rx, 0);
 类似资料:
  • 问题内容: Go扫描程序包中使用技巧来查找空白: 然后: 由于字符值向左移超过31,因此在某些情况下这不是唯一的吗?我的意思是,当某些char与制表符模数32相同时,它将被识别为空格吗? 问题答案: 完全答案: Spec明确表示,对于无符号操作,我们会屏蔽掉高位,因此低位实际上是“环绕”的。 它起作用的原因是: 实际上是完全适合的价值 在运行时对无符号整数进行的运算可以具有任意大的中间值,并且会回

  • 问题内容: 我从来不是一个正则表达式大师,所以我需要您的帮助!我有一个像这样的字符串: 我想使用空格作为定界符来分割此字符串-但我不想分割在方括号内出现的空格。因此,从上面的示例中,我想要这个数组: 关于什么正则表达式的任何建议可以结合使用以实现这一目标? 这是另一个例子: 变成 问题答案: 我认为这应该起作用,使用负前瞻 -不匹配在没有括号的情况下关闭括号之前没有的空格: 对于嵌套的括号,您将需

  • 下面的代码显示了一个错误。我对编码很陌生。这东西弄乱了我的脑袋。我能做什么? 下面的代码在编辑之后。但它仍然显示出NoSuchElementFound异常的相同错误。

  • 我有麻烦更新一个变量的名称为一个对象使用扫描器。我提供一个菜单给用户,用户选择他的选择(更新名称),程序要求用户输入新的名称,扫描器读取system.in并更新变量的名称。唯一的问题是程序不能读取带有空格的字符串。例如: 如果键入类似的内容,则可以执行此操作,但如果键入,则将得到,输出示例如下 所以我猜它只读取t,当扫描器扫描shipProperty值时,它读取dog而不是等待输入。我读过关于的文

  • 我有一个类,它创建多个对象,并将它们放入中,如下所示: 我有一个应用程序,它从控制台扫描输入“add”,如果找到,就调用方法,如下所示: 应用程序应该允许用户输入“add”,但在调用方法后,将出现错误“no line found”。 我猜这是因为方法中的没有关闭,然后在需要时重新打开。这是程序的问题吗?如果是,我该如何修复它? 请注意,这个程序还没有完成,因为我将添加一个出售这些股票的销售方法。这

  • 我正在尝试编写一个正则表达式模式,并使用split函数对所有句点进行拆分,除非这些句点位于开括号和闭括号或花括号之间。我想我是对的,因为在一个在线正则表达式测试程序中,当我运行拆分时,它正确地突出显示了我想要拆分的周期,它拆分的不仅仅是周期,还创建了一个长列表。我想我正在做一些明显的事情,但似乎无法理解。请看下面的内容。谢谢 到目前为止我所拥有的: Regex到目前为止: .(? =([^]]([