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"
};
对于 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"
};