在Java中如何分割字符串?

3

这是在Java 7中的内容

我不懂正则表达式,所以想知道有没有人知道如何使用split方法从字符串中获取所有用户名:

{tchristofferson=10, mchristofferson=50}

然后将用户名添加到一个String[]数组中?这里只有两个用户名,但我希望它可以适用于无限数量的用户名。

用户名需要遵循以下格式:

3-16个字符,无空格,仅限A-Z大写和小写字母以及0-9数字,唯一的特殊字符是_(下划线)。


一个用户名中可以包括哪些有效字符?它能包含数字、特殊字符(如_-)等吗? - David Choweller
你应该使用哪个版本的Java来完成这项任务? - j2ko
我正在使用Java 7进行此操作。 - tchristofferson
用户名需符合以下要求:3-16个字符,不能包含空格,只能使用A-Z大小写字母和0-9数字,唯一的特殊字符是下划线(_)。 - tchristofferson
4个回答

1
这看起来像是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());

1
这不是有效的JSON格式:JSON字符串值(严格来说,键名也是)应该用引号括起来。大多数解析器都会拒绝此输入。 - slim
1
实际上,JSON 应该使用冒号而不是等号。 - Jack
Pattern#splitAsStream 可能更为简洁。 - AJNeufeld

1
这是错误的(工作保障)方式:

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+"。我包含它是为了以防您也想对这些值进行处理。

0
您可以尝试在没有单词(A-Za-z)的情况下进行拆分:
String[] tokens = test.split("[^A-Za-z]");

如果不介意使用List,可以像@Mureinik建议的那样尝试:

    List<String> tokens2 = Arrays.stream(test.split("[^A-Za-z]"))
            .distinct()
            .filter(w -> !w.isEmpty())
            .collect(Collectors.toList());

编辑1:

如果列表包含数字,请尝试:

String[] tokens = test.split("[^A-Za-z\w]");

如果您想尝试正则表达式,我强烈推荐这个网站:

http://regexr.com/


如果用户名可能包含数字,我该如何做到这一点? - tchristofferson
[^A-Za-z\\w] 等同于 [^\\w],也等同于 \W。这将输出 ["", "tchristofferson", "10", "", "mchristofferson", "50"],其中 """10""""50" 不是用户名。 - AJNeufeld

0
如果 用户名 包含 数字 和特殊字符,比如 =,那么:

String str = "tchristofferson=10,mchristofferson=50";    
Pattern ptn = Pattern.compile(",");
String[] usernames = ptn.split(str); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接