如果它只有一个项目,是否有一种"更清洁"的方法来解析一个被删除的字符串?

use*_*127 4 java regex string tokenize delimiter

我有一个字符串.此字符串具有由逗号分隔的值(例如Bob,John,Jill),但有时此String将只有一个值(例如Bob).我需要提取这些值,所以我使用这样的东西:

String str = "Bob,John,Jill";
StringTokenizer strTok = new StringTokenizer(str , ",");
Run Code Online (Sandbox Code Playgroud)

这有效,我现在可以单独访问3个名称.但是如果我的String只包含单词Bob(现在没有逗号)怎么办.这段代码失败所以我的解决方案是检查是否存在逗号,如果它存在,那么我tokanize,如果没有那么我只是得到字符串(我知道这个条件语句不好,因为它没有正确处理null和其他条件,但我只是想保持简短以显示问题):

if( (str != null) && (!str.isEmpty()) && (!str.contains(",")) && (str.length() > 0)){
    // only 1 element exists, just use the string
}
else{
    //Tokenize
}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎不是一个非常干净的解决方案,有没有更好的方法来实现这一点,我可以避免这样的条件检查?我尝试使用正则表达式,但如果只有一个元素,或者我可以使用的某个第三方库,则无法解决帐户问题?

dim*_*414 6

不要使用StringTokenizer:

StringTokenizer是一个遗留类,出于兼容性原因而保留,尽管在新代码中不鼓励使用它.建议任何寻求此功能的人都使用split方法Stringjava.util.regex包.

你应该使用番石榴 Splitter代替.您可以使用String.split()(这是JDK建议的替代方案),但它的功能不强,并且使得尾随分隔符处理变得混乱.


出于教育目的,这里是你如何使用a Pattern来做同样的工作(但再次,只是使用Splitter):

// Matches up to the next comma or the end of the line
Pattern CSV_PATTERN = Pattern.compile("(?<=,|^)([^,]*)(,|$)");

List<String> ls = new ArrayList<String>();
Matcher m = CSV_PATTERN.matcher(input);
while (m.find()) {
  ls.add(m.group(1).trim()); // .trim() is optional
}
Run Code Online (Sandbox Code Playgroud)

正则表达式向后查找逗号或字符串的开头(以避免字符串末尾的零宽度匹配),后跟零个或多个非逗号字符,后跟逗号或行尾.

  • @ user2924127是的,它可以在没有逗号的单个元素上正常工作. (2认同)