我構建了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