Java 拆分字符串(检查给定参数)

Java split string (check given parameters)

对于 Java IRC 客户端,我有一个登录功能。如果您输入“!LOGIN user pass”,它将让您登录。

现在,如果用户过多地使用 space 或仅使用 1 个参数而不是 "user" + "pass",由于我拆分的方式,程序会崩溃线。

我找不到解决方案,因此我可以检查字符串用户或字符串是否通过 != null..

如有任何建议,我们将不胜感激!

if (line.contains("!LOGIN")){  //!LOGIN username password
  String[] parts = line.split(" ");
  String user = parts[4]; 
  String pass = parts[5];
}
if (line.contains("!LOGIN")){  //!LOGIN username password
  String[] parts = line.split("\s+");
  String user = parts.length > 3 ? parts[4] : ""; 
  String pass = parts.length > 4 ? parts[5] : "";
}

使用上面评论中描述的正则表达式,然后检查数组的大小。

一般来说,建议在解析之前验证您的输入,或者测试解析是否有效。

在这种情况下,您是在字符串上拆分,这给您带来不确定性。

您至少应该测试一下您是否有足够的块:

String[] parts = line.split(" ");
if (parts.length >= 5) { 
    // your usual logic 
    String user = parts[4]; 
    String pass = parts[5];
}

但通常最好创建一个(严格)定义可接受输入的模式。您首先验证提供的输入是否与预期模式匹配。 (在你的模式中,你决定你想变得多么宽容)

something like:

public class TestPattern {
    public static String[] inputTest = new String[] {
            "!LOGIN user pass",
            "!LOGIN user pass    ",
            "!LOGIN user     pass",
            "!LOGIN     user pass",
            "    !LOGIN user pass",
            "   !LOGIN    user    pass   "
    };

    public static void main(String[] argv) {
        // ^ = start of line
        // \s* = 0 or more spaces
        // \s+ = 1 or more spaces
        // (\w+) = group 1 containing 1 or more word-characters (a-zA-Z etc)
        // $ = end of line 
        Pattern pattern = Pattern.compile("^\s*!LOGIN\s+(\w+)\s+(\w+)\s*$");
        for (String input : inputTest) {
            Matcher matcher = pattern.matcher(input);
            if (!matcher.find()) {
                System.out.println("input didn't match login: " + input);
                continue;
            }

            String username = matcher.group(1);
            String password = matcher.group(2);

            System.out.println("username[ " + username + " ], password[ " + password + " ]");
        }
    }
}

您也可以使用错误的输入进行测试,例如:

public static String[] inputFailed = new String[] {
        "",
        "! LOGIN user pass",
        "!LOGINX user pass",
        "!LOGIN user pass other",
        "!LOGIN userpass"
};