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);
}