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

Java拆分字符串(检查给定参数),java,split,Java,Split,对于Java IRC客户端,我有一个登录功能。如果您键入“!LOGIN user pass”,它将让您登录 现在,如果用户使用空间过多或仅使用1个参数而不是“user”+“pass”,那么由于我拆分行的方式,程序将崩溃 我很难找到解决方案,因此我可以检查字符串用户或字符串是否通过!=空 如有任何建议,将不胜感激 if (line.contains("!LOGIN")){ //!LOGIN username password String[] parts = line.split(" ");

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

现在,如果用户使用空间过多或仅使用1个参数而不是“user”+“pass”,那么由于我拆分行的方式,程序将崩溃

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

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

if (line.contains("!LOGIN")){  //!LOGIN username password
  String[] parts = line.split(" ");
  String user = parts[4]; 
  String pass = parts[5];
}

按照上面注释中的说明使用正则表达式,然后检查数组的大小。

通常建议在解析输入之前验证输入,或者测试解析是否有效

在这种情况下,您是在字符串上拆分的,这并没有给您任何确定性

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

String[] parts = line.split(" ");
if (parts.length >= 5) { 
    // your usual logic 
    String user = parts[4]; 
    String pass = parts[5];
}
但通常最好创建一个(严格地)定义可接受输入的模式。首先验证提供的输入是否与预期模式匹配。(在你的模式中,你决定要多宽大)

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

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

您可以先检查类似的部分[4]和部分[5]是否不为空。请使用正则表达式,
\\s+
而不是
(请注意,
split
接受正则表达式,而不是字符串)。让它正常工作,谢谢!
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"
};