我构建了i个java类名Scanner
。
该类打开文件并在其上应用三个正则表达式。
在我的Linux系统上,所有三种模式都运行良好。在Windows上只有两个,下班后我真的不知道为什么......
这是我的三种模式
private static final Pattern TILE_PATTERN = Pattern.compile("<xyz:tile\\sfilename=\"(\\S+)\"");
private static final Pattern VALUE_PATTERN = Pattern.compile("<xyz:value\\sxyz:name=\"(\\S+)\"[\\sxyz:type=\"(\\S)\"]*>");
private static final Pattern IF_PATTERN = Pattern.compile("<xyz:if-visible\\sxyz:name=\"(\\S+)\">");
VALUE_PATTERN
和IF_PATTERN
都可以。
TILE_PATTERN
不起作用......
这是我的方法:
public static List<String> scanForTiles(TemplateModel template) {
try (Stream<String> stream = Files.lines(template.getPath())) {
List<String> includes = new ArrayList<>();
stream.map(TILE_PATTERN::matcher)
.flatMap(matcher -> {
List<String> list = new ArrayList<>();
while (matcher.find()) {
list.add(matcher.group(1));
}
return list.stream();
})
.forEach(includes::add);
return includes;
}catch (IOException e) {
e.printStackTrace();
}
return null;
}
我模板的示例代码:
<!-- NOT ok -->
<xyz:tile filename="containers/mainLogin.html">
<!-- OK -->
<xyz:if-visible xyz:name=".variable">
答案 0 :(得分:0)
Linux和windows之间的显着区别是新行。在linux中,新行的字符是\ n(换行符)在windows中,新行由两个字符\ r \ n(回车符和换行符)表示。
此外,默认情况下,正则表达式不会在多行上匹配,并且通常新行字符充当$或结束行匹配器,这可能是正则表达式在两个操作系统中表现不同的原因之一。