Java 代码分析失败:用于正则表达式的File.separator

Java 代码分析失败:用于正则表达式的File.separator,java,Java,我有一个代码分析工具,如果在下面的方法中标记File.separator并将其作为一个关键问题提出来,它会自动运行。我不知道如何实施建议的修复,有什么想法吗 正确性-用于正则表达式的File.separator 这里的代码使用File.separator,其中需要正则表达式。这将在Windows平台上失败,其中File.separator是反斜杠,在正则表达式中被解释为转义字符。在其他选项中,您可以只使用File.separatorChar='\'&“\\\”:File.separator而不是

我有一个代码分析工具,如果在下面的方法中标记File.separator并将其作为一个关键问题提出来,它会自动运行。我不知道如何实施建议的修复,有什么想法吗

正确性-用于正则表达式的File.separator
这里的代码使用File.separator,其中需要正则表达式。这将在Windows平台上失败,其中File.separator是反斜杠,在正则表达式中被解释为转义字符。在其他选项中,您可以只使用File.separatorChar='\'&“\\\”:File.separator而不是File.separator

 private LinkedHashSet<String> process(Set<String> directoryList) {
    LinkedHashSet<String> fullSet = new LinkedHashSet<String>();
    for (String i : directoryList) {
      String[] str = i.split(File.separator);
      StringBuilder sb = new StringBuilder();
      for (String s : str) {
        sb.append(s);
        fullSet.add(sb.toString());
        sb.append(File.separator);
      }
    }
    return fullSet;
  }
private LinkedHashSet进程(Set directoryList){
LinkedHashSet fullSet=新LinkedHashSet();
for(字符串i:目录列表){
字符串[]str=i.split(File.separator);
StringBuilder sb=新的StringBuilder();
for(字符串s:str){
某人追加;
添加(sb.toString());
sb.append(File.separator);
}
}
返回全集;
}
根据,一切都在控制之中

在UNIX系统上,此字段的值为“/”;在Microsoft Windows系统上,它是“\\”

如果将“\\”放在一个空格中,它将被视为反斜杠,正如您所期望的那样

据报道,一切都在控制之中

在UNIX系统上,此字段的值为“/”;在Microsoft Windows系统上,它是“\\”


如果将“\\”放在一个空格中,它将被视为反斜杠,正如您所期望的那样

Java文档,用于
File.separatorChar()

此字段初始化为包含值的第一个字符 系统属性file.separator的。在UNIX系统上 该字段为“/”;在Microsoft Windows系统上,它是“\”


它清楚地表明windows的
\
将被视为
\
,您可以在正则表达式中使用它,因为它不会被视为特殊字符。

Java doc for
File.separatorChar()

此字段初始化为包含值的第一个字符 系统属性file.separator的。在UNIX系统上 该字段为“/”;在Microsoft Windows系统上,它是“\”


它清楚地表明windows的
\
将被视为
\
,您可以在正则表达式中使用它,因为它不会被视为特殊字符。

解释非常清楚,但具体问题如下:

当您的代码在windows
文件上运行时,separator
\
,所以

i.split(File.separator);
阅读


split()
将正则表达式作为参数,但
\
不是正则表达式(请注意,java中的字符串literal
“\\”
将导致一个只有
'\'
的单字符字符串),因为反斜杠是转义字符,因此代码将导致运行时错误

解释很清楚,但具体问题如下:

当您的代码在windows
文件上运行时,separator
\
,所以

i.split(File.separator);
阅读


split()
将正则表达式作为参数,但
\
不是正则表达式(请注意,java中的字符串literal
“\\”
将导致一个只有
'\'
的单字符字符串),因为反斜杠是转义字符,因此代码将导致运行时错误

我最后使用了“
\\
”,但如果代码在Unix上,我不知道该怎么办。

我最后使用了“
\
”,但如果代码在Unix上,我不知道该怎么办。

你的问题有解释,为什么
文件。分隔符
不是正则表达式的标准。它根据操作系统的不同而不同。
File.separator
的值在每个平台上都不同,该值由VM提供。这意味着您的正则表达式在每个平台上看起来都不同。虽然这对UNIX(“/”)和Windows(“\”)来说不是坏事,但它可能会在其他外来VM/OSs/文件系统上引起问题。您的问题有解释,为什么
File.separator
不是正则表达式的标准。它根据操作系统的不同而不同。
File.separator
的值在每个平台上都不同,该值由VM提供。这意味着您的正则表达式在每个平台上看起来都不同。虽然这对UNIX(“/”)和Windows(“\”)来说不是一件坏事,但它可能会在其他外来的VM/OSs/文件系统上引起问题。事实并非如此在Java代码中,它的意思是“\”。反斜杠需要在Java和正则表达式中转义。因此,Windows中的File.separator需要对regexp使用转义反斜杠。如果你想写整个语句,你需要一个
i.split(“\\\\”)
来实现一个“\\\”的regexp,它将匹配一个单独的\不是真的。'\\'在Java代码中,它的意思是“\”。反斜杠需要在Java和正则表达式中转义。因此,Windows中的File.separator需要对regexp使用转义反斜杠。如果你想写整个语句,你需要一个
i.split(\\\\\”
来实现一个“\\\”的regexp,然后它将匹配一个单独的\i假设使用一个私有的静态字符串SLASH\u PATTERN=PATTERN.quote(System.getProperty(“file.separator”);已经足够了。我假设使用私有静态最终字符串SLASH_PATTERN=PATTERN.quote(System.getProperty(“file.separator”);这就足够了。