2016-03-02 195 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

相關問題