如何拆分逗号分隔的字符串?
Posted
技术标签:
【中文标题】如何拆分逗号分隔的字符串?【英文标题】:How to split a comma-separated string? 【发布时间】:2012-05-24 19:02:34 【问题描述】:我有一个长度未知的字符串,看起来像这样
"dog, cat, bear, elephant, ..., giraffe"
用逗号分割这个字符串以便每个单词都可以成为 ArrayList 的一个元素的最佳方法是什么?
例如
List<String> strings = new ArrayList<Strings>();
// Add the data here so strings.get(0) would be equal to "dog",
// strings.get(1) would be equal to "cat" and so forth.
【问题讨论】:
使用方法 split("spliting char") 它分割你的字符串,方法将创建带有分割词的字符串数组。 【参考方案1】:你可以这样做:
String str = "...";
List<String> elephantList = Arrays.asList(str.split(","));
基本上.split()
方法将根据(在这种情况下)您传递的分隔符拆分字符串,并返回一个字符串数组。
但是,您似乎在寻找字符串列表而不是数组,因此必须使用 Arrays.asList()
实用程序将数组转换为列表。仅供参考,您也可以这样做:
String str = "...";
ArrayList<String> elephantList = new ArrayList<>(Arrays.asList(str.split(","));
但通常更好的做法是编程到接口而不是实际的具体实现,所以我推荐第一个选项。
【讨论】:
请记住,这不会修剪值,因此 strings.get(1) 将是“cat”而不是“cat”str.split
接受正则表达式,因此您可以使用 str.split(",[ ]*");
以便删除逗号后的逗号和空格。
逗号分隔文件 (csv) 可能在引号中包含逗号,这意味着它不是分隔符。在这种情况下,拆分将不起作用。
第二个选项要求转换为ArrayList<String>
。
如果您需要保留空条目(例如,为了一致的数组长度)使用 split(",",-1) 按照***.com/questions/14602062/…【参考方案2】:
嗯,你想拆分,对吧?
String animals = "dog, cat, bear, elephant, giraffe";
String[] animalsArray = animals.split(",");
如果您还想去除项目周围的空格:
String[] animalsArray = animals.split("\\s*,\\s*");
【讨论】:
是的,这是解决方案的一部分。 OP 似乎在一个字符串列表之后,而不是一个数组。 @npinti:是的,+1 给你,你速度更快,我不想复制你的Arrays.asList()
成语。
我思考了 10 个小时,然后搜索了 SO。不知道 .split(); 这么容易。
如果您想将生成的拆分项存储在一个集合中而不是一个数组中怎么办?【参考方案3】:
一个小的改进:上述解决方案不会删除实际字符串中的前导或尾随空格。最好在调用 split 之前调用 trim。 而不是这个,
String[] animalsArray = animals.split("\\s*,\\s*");
使用
String[] animalsArray = animals.trim().split("\\s*,\\s*");
【讨论】:
对于你的第二行,如果我们使用 trim() 那么我们不需要像("\\s*,\\s*")
这样的空间分割,只需使用 (",");
这将得到相同的结果。
我不确定@WIZARD,因为 trim 只删除字符串的左右空格,而不是其中的空格。所以trim(" string, with , space ")
将是"string, with , space"
。
@ThomasLeduc 如果字符串是这样的"dog, cat, bear, elephant, giraffe"
,则不需要trim()
,如果使用trim()
,那么输出将是"string,with,space"
,而不是"string, with , space"
trim()
将删除所有空格,而不仅仅是字符串的左右空格
你测试了吗?因为我刚刚写了一个java程序,字符串" string, with , space ".trim()
返回"string, with , space"
。就像 javadoc 所说:返回字符串的副本,省略前导和尾随空格。你错了,@user872858 是对的。【参考方案4】:
首先你可以像这样拆分名字
String animals = "dog, cat, bear, elephant,giraffe";
String animals_list[] = animals.split(",");
访问你的动物
String animal1 = animals_list[0];
String animal2 = animals_list[1];
String animal3 = animals_list[2];
String animal4 = animals_list[3];
您还想删除动物名称周围的空格和逗号
String animals_list[] = animals.split("\\s*,\\s*");
【讨论】:
【参考方案5】:有一个名为replaceAll()
的函数可以删除所有空格,方法是用您想要的任何内容替换它们。举个例子
String str=" 15. 9 4;16.0 1"
String firstAndSecond[]=str.replaceAll("\\s","").split(";");
System.out.println("First:"+firstAndSecond[0]+", Second:"+firstAndSecond[1]);
会给你:
First:15.94, Second:16.01
【讨论】:
【参考方案6】:为了完整起见,使用 Guava 库,您可以:Splitter.on(",").split(“dog,cat,fox”)
另一个例子:
String animals = "dog,cat, bear,elephant , giraffe , zebra ,walrus";
List<String> l = Lists.newArrayList(Splitter.on(",").trimResults().split(animals));
// -> [dog, cat, bear, elephant, giraffe, zebra, walrus]
Splitter.split()
返回一个 Iterable,因此如果您需要一个 List,请将其包装在 Lists.newArrayList()
中,如上所述。否则只需使用 Iterable,例如:
for (String animal : Splitter.on(",").trimResults().split(animals))
// ...
请注意trimResults()
如何无需tweak regexes for corner cases 就可以满足您的所有修剪需求,就像String.split()
一样。
如果您的项目已经使用 Guava,这应该是您的首选解决方案。有关更多配置选项,请参阅 Guava User Guide 或 javadocs 中的拆分器文档。
【讨论】:
【参考方案7】:你可以把它拆分成一个数组,然后像数组一样访问
String names = "prappo,prince";
String[] namesList = names.split(",");
你可以访问像
String name1 = namesList [0];
String name2 = namesList [1];
或使用循环
for(String name : namesList)
System.out.println(name);
希望对你有所帮助。
【讨论】:
【参考方案8】:删除所有空格并创建一个固定大小或不可变列表(参见asList
API docs)
final String str = "dog, cat, bear, elephant, ..., giraffe";
List<String> list = Arrays.asList(str.replaceAll("\\s", "").split(","));
// result: [dog, cat, bear, elephant, ..., giraffe]
也可以使用replaceAll(\\s+", "")
,但最大效率取决于用例。 (请参阅@GurselKoca answer 在 Java 中从字符串中删除空格)
【讨论】:
【参考方案9】:你可以这样使用:
String animals = "dog, cat, bear, elephant, giraffe";
List<String> animalList = Arrays.asList(animals.split(","));
此外,您还需要包含库:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
【讨论】:
【参考方案10】:可以试试这个对我有用
sg = sg.replaceAll(", $", "");
否则
if (sg.endsWith(","))
sg = sg.substring(0, sg.length() - 1);
【讨论】:
【参考方案11】:使用这个:
List<String> splitString = (List<String>) Arrays.asList(jobtype.split(","));
【讨论】:
【参考方案12】:在 Kotlin 中,
val stringArray = commasString.replace(", ", ",").split(",")
其中stringArray
是List<String>
,commasString
是String
,带有逗号和空格
【讨论】:
【参考方案13】:在 build.gradle 中添加 Guava
compile group: 'com.google.guava', name: 'guava', version: '27.0-jre'
然后
public static List<String> splitByComma(String str)
Iterable<String> split = Splitter.on(",")
.omitEmptyStrings()
.trimResults()
.split(str);
return Lists.newArrayList(split);
public static String joinWithComma(Set<String> words)
return Joiner.on(", ").skipNulls().join(words);
享受:)
【讨论】:
你可以使用 Splitter.splitToList 返回一个不可修改的列表【参考方案14】:这是用逗号分割字符串的简单方法,
import java.util.*;
public class SeparatedByComma
public static void main(String []args)
String listOfStates = "Hasalak, Mahiyanganaya, Dambarawa, Colombo";
List<String> stateList = Arrays.asList(listOfStates.split("\\,"));
System.out.println(stateList);
【讨论】:
这段代码我用于 JDK。如果您需要打印数组。使用 System.out.println【参考方案15】:“老派”(JDK1.0)java.util类StringTokenizer:
StringTokenizer(String str, String delim)
import java.util.*;
public class Tokenizer
public static void main(String[] args)
String str = "dog, cat, bear, elephant, ..., giraffe";
StringTokenizer tokenizer = new StringTokenizer(str, ",");
List<String> strings = new ArrayList<String>();
while (tokenizer.hasMoreTokens())
// if need to trim spaces .trim() or use delim like ", "
String token = tokenizer.nextToken().trim();
strings.add(token);
// test output
strings.forEach(System.out::println);
注意: StringTokenizer 是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人使用 String 的 split 方法或 java.util.regex 包而是。
例子:
import java.util.regex.*;
...
// Recommended method<?>
Pattern commaPattern = Pattern.compile("\\s*,\\s*");
String[] words = commaPattern.split(str);
List<String> wordList = new ArrayList<String>(Arrays.asList(words));
// test output
wordList.forEach(System.out::println);
...
【讨论】:
以上是关于如何拆分逗号分隔的字符串?的主要内容,如果未能解决你的问题,请参考以下文章