System.getenv()返回\

时间:2012-01-08 16:57:27

标签: java regex exec

好的,所以我试图通过System.getenv函数创建一个到计算机上某个地方的路径,并在路径中返回一个\而不是我需要的路径。我尝试过replaceAll方法,但它返回一个错误:

Exception in thread "main" 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.replaceAll(Unknown Source)
    at Launcher.start(Launcher.java:75)
    at Launcher.Download(Launcher.java:55)
    at Launcher.<init>(Launcher.java:31)
    at Launcher.main(Launcher.java:17)

代码行是:

InputStream OS = Runtime.getRuntime().exec(new String[]{"java",System.getenv("APPDATA").replaceAll("\\", "/")+"/MS2-torsteinv/MS2-bin/no/torsteinv/MarsSettlement2/Client/Client.class"}).getErrorStream();

3 个答案:

答案 0 :(得分:4)

你需要加倍反斜杠:

.replaceAll("\\\\", "/")

规范正则表达式确实是\\,但在Java正则表达式中是字符串,而在Java字符串中,需要使用另一个反斜杠转义字面反斜杠。因此\\变为"\\\\"

答案 1 :(得分:3)

在Java正则表达式中,您必须再次转义反斜杠和java字符串。总共有四个反斜杠。

replaceAll("\\\\", "/")

答案 2 :(得分:2)

  

它在路径中返回一个\而不是我需要的东西。

平台默认肯定 你需要的东西。

import java.io.File;

class FormPath {
    public static void main(String[] args) {
        String relPath = "/MS2-torsteinv/MS2-bin/no/" +
            "torsteinv/MarsSettlement2/Client/Client.class";
        String[] parts = relPath.split("/");
        File f = new File(System.getenv("APPDATA"));
        System.out.println(f + " exists: " + f.exists());

        for (String part : parts) {
            // use the File constructor that will insert the correct separator
            f = new File(f,part);
        }
        System.out.println(f + " exists: " + f.exists());
    }
}

输出

C:\Users\Andrew\AppData\Roaming exists: true
C:\Users\Andrew\AppData\Roaming\MS2-torsteinv\MS2-bin\no\torsteinv\MarsSettlement2\Client\Client.class exists: false
Press any key to continue . . .