这是Java 7在Java中分割字符串?
我不知道正则表达式,所以我想知道是否有人知道我怎么会用分裂的方式,让所有的用户名进行的字符串:
{tchristofferson=10, mchristofferson=50}
,然后将用户名添加到一个String []数组?这里只有两个用户名,但我希望这可以用于无限量的用户名。
用户名所需要的格式如下:
3-16字符,没有空格,A-Z上,下壳体和0-9中,只有特殊字符是下划线(_)。
这是Java 7在Java中分割字符串?
我不知道正则表达式,所以我想知道是否有人知道我怎么会用分裂的方式,让所有的用户名进行的字符串:
{tchristofferson=10, mchristofferson=50}
,然后将用户名添加到一个String []数组?这里只有两个用户名,但我希望这可以用于无限量的用户名。
用户名所需要的格式如下:
3-16字符,没有空格,A-Z上,下壳体和0-9中,只有特殊字符是下划线(_)。
这看起来像JSON,因此,“正确”的答案很可能是使用JSON解析器。如果这不是一种选择,你可以根据=
标志去掉封闭{}
,根据", "
分割字符串,然后分割每个字符串,采取的第一项:
String input = "{tchristofferson=10, mchristofferson=50}";
List<String> users =
Arrays.stream(input.substring(1, input.length() - 1).split(", "))
.map(s -> s.split("=")[0])
.collect(Collectors.toList());
这是错误的(工作安全)的方式:
String[] usernames = str.substring(1)
.split("=\\d+[,}]\\s*");
为什么这是错误的方式?我们扔掉了我们不想要的东西。 第一个字符(不管它是什么),并希望"=#, "
和“=#}”是我们不希望的唯一的东西。 如果字符串开始"{ tchristofferson=10"
,那么第一个用户名会得到一个前导空格。
更好的方法是要匹配你想要的东西。而现在,我并不想给iPhone屏幕上创建了答案,那就是:
String input = "{tchristofferson=10, mchristofferson=50}";
Pattern USERNAME_VALUE = Pattern.compile("(\\w+)=(\\d+)");
Matcher matcher = USERNAME_VALUE.matcher(input);
ArrayList<String> list = new ArrayList<>();
while(matcher.find()) {
list.add(matcher.group(1));
}
String[] usernames = list.toArray(new String[0]);
这里假设你的用户名中的每个字符的\w
模式相匹配(即[a-zA-Z0-9_]
和其他字母数字Unicode代码点) 。如果您的用户名要求更多/更少限制,请修改。
(\w+)
用于捕获用户名为matcher.group(1)
,该用户名被添加到最终变成您的String[]
的列表中。
(\d+)
也被用于捕捉与该用户作为matcher.group(2)
相关的数字。这个捕获组没有(目前)被使用,因此您可以删除小括号以获得较小的效率增益,即"(\\w+)=\\d+"
。如果你想对这些值做些什么的话,我会把它包括进来。
你可以尝试分裂时没有(^)一词(A-ZA-Z):
String[] tokens = test.split("[^A-Za-z]");
如果不介意使用列表,尝试像@Mureinik与建议:
List<String> tokens2 = Arrays.stream(test.split("[^A-Za-z]"))
.distinct()
.filter(w -> !w.isEmpty())
.collect(Collectors.toList());
EDIT1:
如果列表中包含数字尝试:
String [] tokens = test.split(“[^ A-Za-z \ w]”);
,如果你想用正则表达式来试验我强烈推荐这个网站:
如果用户名可能包含数字,我怎么能这样做? – tchristofferson
'[^ A-Za-z \\ w]'相当于'[^ \\ w]',相当于'\ W'。这给出了“[”“”,“tchristofferson”,“10”,“”,“mchristofferson”,“50”]'的输出,其中'“”''''10“',''''和'” 50“'不是用户名。 – AJNeufeld
你说得对。我会解决这个问题。 –
如果用户名包括号和特殊字符,例如=则:
String str = "tchristofferson=10,mchristofferson=50";
Pattern ptn = Pattern.compile(",");
String[] usernames = ptn.split(str);
用户名中有效的字符是什么?它可以包括数字和_-等特殊字符。 –
你应该使用哪个版本的Java来完成这个任务? – j2ko
我在java 7 – tchristofferson