gpt4 book ai didi

java - 使用java.util.Scanner对象的skip(String)方法时如何忽略换行符?

转载 作者:行者123 更新时间:2023-11-30 04:20:10 25 4
gpt4 key购买 nike

我想节省一些时间,而不是手动测试解析文件中的每个标记,但似乎我不知道如何正确使用 java 的 skip(String) 方法.util.Scanner 类。

重新表述一下问题:如何才能通过下面的两个测试?

import java.io.StringReader;
import java.util.Scanner;
import junit.framework.Assert;
import org.junit.Test;

public class ScannerTest {

static private final String text = "FUNCTION_BLOCK Unnamed_project\n\tVAR_INPUT\n\t\tUnnamed_variable1 : REAL;\n\tEND_VAR\nEND_FUNCTION_BLOCK";

@Test
public void scannerSkipTest() {

Scanner sc = new Scanner(new StringReader(text));
sc.skip("(?i)FUNCTION_BLOCK");
String blockName = sc.next();
assert sc.hasNext("(?i)VAR_INPUT"); // added test
sc.skip("(?i)VAR_INPUT"); // line of failure
String variableName = sc.next();
sc.skip(":");
String type = sc.next();
sc.skip("(?i)END_VAR");
sc.skip("(?i)END_FUNCTION_BLOCK");

assert "Unnamed_project".equals(blockName);
assert "Unnamed_variable1".equals(variableName);
assert "REAL".equals(type);
}

@Test
public void scannerWithoutSkipTest() {
Scanner sc = new Scanner(new StringReader(text));
String skipped = sc.next();
assert "FUNCTION_BLOCK".equalsIgnoreCase(skipped);
String blockName = sc.next();
skipped = sc.next();
assert "VAR_INPUT".equalsIgnoreCase(skipped);
String variableName = sc.next();
skipped = sc.next();
assert ":".equalsIgnoreCase(skipped);
String type = sc.next();
skipped = sc.next();
assert "END_VAR".equalsIgnoreCase(skipped);
skipped = sc.next();
assert "END_FUNCTION_BLOCK".equalsIgnoreCase(skipped);

assert "Unnamed_project".equals(blockName);
assert "Unnamed_variable1".equals(variableName);
assert "REAL".equals(type);
}
}

任何提示和提示表示赞赏。

最佳答案

Tuto,感谢您在尝试后编辑我的答案,我将采用您所写的内容并重写顶部的解释。

基本上,当想要使用 skip() 跳过标记时,您需要首先跳过空格。相比之下,next() 方法会自动执行此操作。

来自javadoc:

next() 和 hasNext() 方法及其基元类型伴生方法(例如 nextInt() 和 hasNextInt())首先跳过与分隔符模式匹配的任何输入,然后尝试返回下一个 token 。

因此,通过使用 sc.skip(WHITESPACE + "abc"),您可以跳过任何空格,然后跳过标记 abc。结果如下所示:

public class ScannerTest {

static private final String text = "FUNCTION_BLOCK Unnamed_project\n\tVAR_INPUT\n\t\tUnnamed_variable1 : REAL;\n\tEND_VAR\nEND_FUNCTION_BLOCK";
public static final String WHITESPACE = "[ \\n\\t]+";

@Test
public void scannerSkipTest() {

Scanner sc = new Scanner(new StringReader(text));
sc.useDelimiter(WHITESPACE);
sc.skip("FUNCTION_BLOCK");
String blockName = sc.next();
sc.skip(WHITESPACE + "VAR_INPUT");
String variableName = sc.next();
sc.skip(WHITESPACE + ":");
String typeWithSemiColon = sc.next();
sc.skip(WHITESPACE + "END_VAR");
sc.skip(WHITESPACE + "END_FUNCTION_BLOCK");

assert "Unnamed_project".equals(blockName);
assert "Unnamed_variable1".equals(variableName);
assert "REAL;".equals(typeWithSemiColon);
}
}

请注意,扫描仪仍然不会将 REAL; 分开,因为分号并不是真正的空白 - 我将其作为练习让您弄清楚: )

关于java - 使用java.util.Scanner对象的skip(String)方法时如何忽略换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17249480/

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