PatternSyntaxException:Windows下`.split(File.separator)`的索引1附近出现意外的内部错误

Dan*_*iel 9 java

下面的代码片段在linux下工作正常,但在windows下给我错误(这很奇怪,因为jvm/jdk应该是与操作系统无关的).

  File f = ... 
  String[] split = f.getPath().split(File.separator);
Run Code Online (Sandbox Code Playgroud)

这是错误:

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
 ^
        at java.util.regex.Pattern.error(Unknown Source)
        at java.util.regex.Pattern.compile(Unknown Source)
        at java.util.regex.Pattern.<init>(Unknown Source)
        at java.util.regex.Pattern.compile(Unknown Source)
        at java.lang.String.split(Unknown Source)
        at java.lang.String.split(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

知道什么是错的吗?

Par*_*alo 11

问题是反斜杠是使用正则表达式的特殊字符(其他特殊字符的转义字符).你应该用

String[] split = f.getPath().split("\\\\");
Run Code Online (Sandbox Code Playgroud)

为了按标志分开\.


如果你想让这个平台保持独立,我会看到你遇到的问题.在这种情况下,你可以做这样的事情:

String splitter = File.separator.replace("\\","\\\\");
String[] split = abc.split(splitter);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这给我省去了一些麻烦。奇怪的是“\\”在 Windows 10 上运行,但在 Windows 7 上崩溃。 (3认同)
  • 好的,“\\”起作用是因为 Java8,而不是因为 Windows 版本,这更有意义。所以在Java7中使用“\\\\”,在Java8中使用“\\”。 (2认同)

Edu*_*ero 5

您应该考虑使用 java.nio 引入的 Path 类。即使混合分隔符它也能工作。这段代码:

    Path path = Paths.get("c:\\a\\with spaces/b");

    for(Iterator<Path> it= path.iterator(); it.hasNext();) {
        System.out.println(it.next());
    }
Run Code Online (Sandbox Code Playgroud)

印刷:

a
with spaces
b
Run Code Online (Sandbox Code Playgroud)