我构建了java类名称Scanner
。 该类打开文件并在其上应用三个正则表达式。Java正则表达式适用于Linux,但不适用于Windows
在我的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
都OK。 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">
添加在Linux上匹配且在Windows上不匹配的字符串的示例。 –
你如何处理'VALUE_PATTERN'和'IF_PATTERN'? – SubOptimal
您的RE的一个(无关的问题)是(至少)Windows允许文件名中有空格。因此'\ S'不适用于所有文件名。 – ClasG