gpt4 book ai didi

java - 使用垂直空白字符作为 java 扫描器分隔符在每个末尾扫描空字符串

转载 作者:太空宇宙 更新时间:2023-11-04 09:38:41 25 4
gpt4 key购买 nike

我正在尝试使用 Java 中的 Scanner 类扫描数据字段由“@”或“endline”分隔的文件。这是一个示例输入文件:

Student @ Codey @ Huntting
Student @ Sarah @ Honsinger

为了正确扫描如下所示的输入文件,我尝试将 Java 扫描器上的分隔符更改为正则表达式 "[@\\v]",该表达式应匹配 @ 或任何垂直空格,包括 \n\r,根据 this page

这是我用来测试它的代码:

Scanner scanner = new Scanner(new File("data/initialize.txt"));
int tokenNum = 0;

scanner.useDelimiter("[@\\v]");

while(scanner.hasNext()) {
System.out.println("Token #" + tokenNum++ + ": " + scanner.next());
}

scanner.close();

我期望扫描的 token 是:

Token #1: Student
Token #2: Codey
Token #3: Huntting
Token #4: Student
Token #5: Sarah
Token #6: Honsinger

但实际收到的代币是:

Token #1: Student
Token #2: Codey
Token #3: Huntting
Token #4
Token #5: Student
Token #6: Sarah
Token #7: Honsinger
Token #8:

我本希望扫描仪在扫描Huntting时,在Huntting后向上移动到换行符,并在下次调用input.next()时跳过该换行符,但由于某种原因,扫描仪似乎在行尾抓取了一个空字符串。

我已经检查了多次,该文件在任何行之后都没有任何空格。我尝试过不同的模式,例如 [@[\\v]][@][\\v],但这些模式总是给出具有相同空字符串错误的数据,或者输出完全不正常。

最佳答案

您的问题是换行符是一对 \r\n ,而 \v 分别匹配它们。为了复制这一点,让我们更改代码以使用内联字符串作为测试数据:

String input = "Student @ Codey @ Huntting\r\n" +
"Student @ Sarah @ Honsinger\r\n";
try (Scanner scanner = new Scanner(input).useDelimiter("[@\\v]")) {
for (int tokenNum = 0; scanner.hasNext(); tokenNum++) {
System.out.println("Token #" + tokenNum + ": \"" + scanner.next() + "\"");
}
}

输出

Token #0: "Student "
Token #1: " Codey "
Token #2: " Huntting"
Token #3: ""
Token #4: "Student "
Token #5: " Sarah "
Token #6: " Honsinger"
Token #7: ""

解决此问题的一种方法是首先尝试匹配 \r\n 对:

useDelimiter("\r\n|[@\\v]")

输出

Token #0: "Student "
Token #1: " Codey "
Token #2: " Huntting"
Token #3: "Student "
Token #4: " Sarah "
Token #5: " Honsinger"

但是,这会花费时间检查 \r 两次,因此最好使用内置 \R (任何 Unicode 换行序列,相当于 \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]):

useDelimiter("@|\\R")

相同的结果,但更清楚地反射(reflect)您想要的匹配方式。

<小时/>

您当然可以使用 trim()strip() 删除前导和尾随空格,但为什么不让 Scanner 来完成这项工作呢?使用 | 需要一个(非捕获)组来将其与空白匹配分开:

useDelimiter("\\s*(?:@|\\R)\\s*")

输出

Token #0: "Student"
Token #1: "Codey"
Token #2: "Huntting"
Token #3: "Student"
Token #4: "Sarah"
Token #5: "Honsinger"

关于java - 使用垂直空白字符作为 java 扫描器分隔符在每个末尾扫描空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56211960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com