2017-02-25 60 views
3

这是Java 7在Java中分割字符串?

我不知道正则表达式,所以我想知道是否有人知道我怎么会用分裂的方式,让所有的用户名进行的字符串:

{tchristofferson=10, mchristofferson=50} 

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

用户名所需要的格式如下:

3-16字符,没有空格,A-Z上,下壳体和0-9中,只有特殊字符是下划线(_)。

+0

用户名中有效的字符是什么?它可以包括数字和_-等特殊字符。 –

+0

你应该使用哪个版本的Java来完成这个任务? – j2ko

+0

我在java 7 – tchristofferson

回答

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

+0

[Pattern#splitAsStream](http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#splitAsStream-java.lang。 CharSequence-)可能更加简洁。 – 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]"); 

如果不介意使用列表,尝试像@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]”);

,如果你想用正则表达式来试验我强烈推荐这个网站:

http://regexr.com/

+0

如果用户名可能包含数字,我怎么能这样做? – tchristofferson

+0

'[^ A-Za-z \\ w]'相当于'[^ \\ w]',相当于'\ W'。这给出了“[”“”,“tchristofferson”,“10”,“”,“mchristofferson”,“50”]'的输出,其中'“”''''10“',''''和'” 50“'不是用户名。 – AJNeufeld

+0

你说得对。我会解决这个问题。 –

0

如果用户名包括和特殊字符,例如=则:

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