【问题标题】:Is there a "cleaner" way to parse a deliminated string if it only has one item?如果它只有一个项目,是否有一种“更干净”的方式来解析分隔字符串?
【发布时间】:2015-11-09 23:11:46
【问题描述】:

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

String str = "Bob,John,Jill";
StringTokenizer strTok = new StringTokenizer(str , ",");

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

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

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

【问题讨论】:

  • 只需在字符串的开头或结尾添加一个逗号
  • @EngineerDollery 在 Java 中有许多常见且功能完善的字符串拆分机制,为什么要破坏您的输入以使其与损坏的、已弃用的工具“工作”?
  • 如果我认为这是一个很好的答案,我会输入它作为答案,而不是评论:) 但是,它确实解决了问题,不是吗?顺便说一句:在 java 中,字符串是不可变的,所以这实际上并没有“破坏”输入。

标签: java regex string tokenize delimiter


【解决方案1】:

不要使用StringTokenizer:

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

您应该改用Guava Splitter。您可以只使用String.split()(这是JDK 建议的替代方案),但它是less powerful and has confusing trailing-delimiter handling


出于教育目的,您可以使用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
}

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

【讨论】:

  • 是拆分使用 regex,例如如果分隔符是.,则必须用\\. 或` *\\ 分隔。 *`
  • 这在String.split()中有明确记录;如果您在不了解它的作用的情况下使用一种方法,我认为这取决于您。尽管如此,Splitter 允许您明确拆分字符、字符串和正则表达式 - 与 String.split() 相比的另一个好处。
  • 添加了指向 Guava 的显式链接。但是,如果 Guava 是您项目中的佼佼者,我很高兴我没有为它工作 :)
  • 这会解析一个没有逗号的元素吗?
  • @user2924127 是的,它可以在没有逗号的单个元素上正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 2017-12-15
相关资源
最近更新 更多