如何通过换行拆分字符串?

时间:2012-11-20 00:42:52

标签: java android

我是Android开发的菜鸟,我试图通过多个换行符多次拆分字符串。我正在尝试拆分的字符串是从数据库查询中提取出来的,其结构如下:

public String getCoin() {
    // TODO Auto-generated method stub
    String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_QUANTITY, KEY_OUNCES, KEY_VALUE };
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
    String result = "";

    int iRow = c.getColumnIndex(KEY_ROWID);
    int iName = c.getColumnIndex(KEY_NAME);
    int iQuantity = c.getColumnIndex(KEY_QUANTITY);
    int iOunces = c.getColumnIndex(KEY_OUNCES);
    int iValue = c.getColumnIndex(KEY_VALUE);

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
        result = result + /*c.getString(iRow) + " " +*/ c.getString(iName).substring(0, Math.min(18, c.getString(iName).length())) + "\n";
    }
    c.close();
    return result;

result.getCoin读作:

alphabravocharlie

我想在换行符处拆分字符串并将每个子字符串放入一个字符串数组中。这是我目前的代码:

String[] separated = result.split("\n");
      for (int i = 0; i < separated.length; i++) {
           chartnames.add("$." + separated[i] + " some text" ); 
           }

这给了我一个输出:

"$.alpha
bravo
charlie some text"

而不是我想要的输出:

"$.alpha some text, $.bravo some text, $.charlie some text"

非常感谢任何帮助

6 个答案:

答案 0 :(得分:46)

您可以使用以下语句按换行符拆分字符串:

   String textStr[] = yourString.split("\\r\\n|\\n|\\r");

答案 1 :(得分:19)

这有点矫枉过正,但你可以使用标准的I / O类:

BufferedReader rdr = new BufferedReader(new StringReader(result));
List<String> lines = new ArrayList<String>();
for (String line = rdr.readLine(); line != null; line = rdr.readLine()) {
    lines.add(line);
}
rdr.close(); // good form to close streams, but unnecessary for StringReader

// lines now contains all the strings between line breaks of any type

这样做的好处是BufferedReader.readLine()具有检测各种线路终结器的所有逻辑。

从Java 8开始,BufferedReader有一个lines()方法,所以有一种更简单的方法(谢谢,@ jaco0646):

List<String> lines = new BufferedReader(new StringReader(result))
                         .lines()
                         .collect(Collectors.toList();

或者,如果需要数组:

String[] lines = new BufferedReader(new StringReader(result))
                     .lines()
                     .toArray(String[]::new);

答案 2 :(得分:4)

使用Apache commons helper class StringUtils。

独立于平台的方式:

String[] lines = StringUtils.split(string, "\r\n");

依赖于平台的方式。也许一些CPU周期更快。但我不认为这很重要。

String[] lines = StringUtils.split(string, System.lineSeparator());

答案 3 :(得分:2)

如果可能的话,我会建议使用Guava Splitter和Joiner类而不是String.split。但即便如此,确保在声明它们时正确地转义正则表达式也很重要。我不确定“\ n”是否会被Java中的正则表达式编译器正确解释,但我不确定它是否也是如此。

覆盖所有可能的行结尾很棘手,因为多个连续的EOL标记会使您的匹配陷入困境。我建议

String [] separated = result.replaceAll("\\r", "").split("\\n");

答案 4 :(得分:1)

Matcher m = Pattern.compile("(^.+$)+", Pattern.MULTILINE).matcher(fieldContents);

while (m.find()) {
    System.out.println("whole group " + m.group())
}

答案 5 :(得分:0)

我建议使用以下代码段,它兼容PC和Mac端线样式。

String [] separated = result.replaceAll("\\r", "\\n")
   .replaceAll("\\n{2,}", "\\n")
   .split("\\n");