Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取扫描程序类使用的当前分隔符_Java_Java.util.scanner - Fatal编程技术网

Java 获取扫描程序类使用的当前分隔符

Java 获取扫描程序类使用的当前分隔符,java,java.util.scanner,Java,Java.util.scanner,当扫描仪使用的当前分隔符是正则表达式时,是否可以获取该分隔符?例如,我有以下代码: String dictionary=“计算机:计算机是一种可以存储数据的电子机器\n” +“并处理大量信息。\n” +“计算机辅助:由计算机完成或改进\n”; 扫描器src=新扫描器(字典); 字符串分隔符regex=“^(+?:)”;// 使用ScannerAPI无法做到这一点 但是,如果查看扫描仪的源代码,您将看到有一个专用的匹配器对象用于匹配分隔符。如果你愿意打开扫描仪抽象(通过讨厌的反射),你可以从匹配器

当扫描仪使用的当前分隔符是正则表达式时,是否可以获取该分隔符?例如,我有以下代码:

String dictionary=“计算机:计算机是一种可以存储数据的电子机器\n”
+“并处理大量信息。\n”
+“计算机辅助:由计算机完成或改进\n”;
扫描器src=新扫描器(字典);

字符串分隔符regex=“^(+?:)”;// 使用
Scanner
API无法做到这一点

但是,如果查看
扫描仪
的源代码,您将看到有一个专用的
匹配器
对象用于匹配分隔符。如果你愿意打开
扫描仪
抽象(通过讨厌的反射),你可以从匹配器中提取你需要的信息。。。如果你在适当的时候检查过

如果您要尝试此方法,我的建议是使用
Scanner
源代码创建您自己的自定义Scanner类。这将使您的代码不受对标准
Scanner
类的实现更改的影响

确保您从OpenJDK获得源代码,并满足文件上“GPLv2”许可证的要求


不管它值多少钱,我同意清扫者在报告中所说的话。对于这个问题,捕获令牌作为分隔符是错误的方法

将“术语”视为一级标记。我将使用
Scanner.next(Pattern)
解析令牌,其中
模式与一个“术语”匹配

与其尝试获取扫描仪的匹配分隔符(这是一个实现细节),不如重写分隔符正则表达式,以便
next
返回所需的内容

例如:

// this matches both the zero-width string before the term, and the zero-width string after the colon
String delimiterRegex = "^(?=.+?:)|(?<=:)";
Pattern delimiterPattern = Pattern.compile(delimiterRegex, Pattern.MULTILINE);
src.useDelimiter(delimiterPattern);
String definition = "";
String term = "";

while(src.hasNext())
{
    term = src.next(); // read the term first!
    definition = src.next();
}

您只能返回用于匹配分隔符的
模式(使用
getDelmiter()
)。但在读取令牌时,似乎没有任何方法可以获得实际的分隔文本。我可能错了,自己判断。你的第一个解决方案正确地看待了问题。此词典的分隔符应为术语前后的边界-新术语(^)行的开头,或冒号后面的边界。不幸的是,如果定义中有冒号,这个(和另一个)解决方案就会崩溃。例如,“时间”的定义可能包括“00:00:00”。但是,这个正则表达式可以完美地工作“^(?=\\w.+?:)|”(?@timothyadam,如果术语可以有
,您的原始正则表达式,
(.+?:)
也不起作用,是吗?如果冒号出现在定义的第1行以外的任何地方,则为真。在定义的第1行之后,行总是以空格开头。因此,我(在我给您的评论中)用“^(?=\\w.+?:)”修复了这个问题。不幸的是,对lookback使用了完全相同的正则表达式,^(?=\\w.+?:)|(?“使用Scanner API没有办法做到这一点。”这是我问的问题的正确答案。但和你一样,我同意Sweeper的答案让我更接近解决方案。
Pattern p = Pattern.compile("([^:\r\n]+?:)([\\s\\S]+?)(?=^[^:\r\n]+?:|\\z)", Pattern.MULTILINE);
Matcher m = p.matcher(dictionary);
while (m.find()) {
    String term = m.group(1);
    String definition = m.group(2);
}