2016-03-02 157 views
1

我构建了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_PATTERNIF_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"> 
+3

添加在Linux上匹配且在Windows上不匹配的字符串的示例。 –

+0

你如何处理'VALUE_PATTERN'和'IF_PATTERN'? – SubOptimal

+0

您的RE的一个(无关的问题)是(至少)Windows允许文件名中有空格。因此'\ S'不适用于所有文件名。 – ClasG

回答

0

在Linux和Windows的新线之间显着的差异。在Linux中,新行的字符是\ n(换行符),新的行由两个字符\ r \ n(回车和换行符)表示。
此外,默认情况下,正则表达式在多行上不匹配,通常新行字符用作$或end行匹配器,这可能是您的正则表达式在两个操作系统中行为不同的原因之一。

+0

您的评论是正确的。但'Files.lines(...)'和底层的'BufferedReader.readline()'需要关心行结束并返回一个行列表,而与行尾字符无关。 – SubOptimal

相关问题