25

我是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"

任何帮助是极大的赞赏

4

6 回答 6

58

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

   String textStr[] = yourString.split("\\r\\n|\\n|\\r");
于 2012-11-20T00:46:14.060 回答
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);
于 2012-11-20T00:51:08.817 回答
5

使用 Apache 公共辅助类 StringUtils。

平台无关方式:

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

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

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

于 2015-11-06T20:21:16.800 回答
2

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

覆盖所有可能的行尾很棘手,因为多个连续的 EOL 标记可能会弄乱您的匹配。我会建议

String [] separated = result.replaceAll("\\r", "").split("\\n");
于 2012-11-20T01:02:18.353 回答
1
Matcher m = Pattern.compile("(^.+$)+", Pattern.MULTILINE).matcher(fieldContents);

while (m.find()) {
    System.out.println("whole group " + m.group())
}
于 2015-02-18T08:45:44.247 回答
0

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

String [] separated = result.replaceAll("\\r", "\\n")
   .replaceAll("\\n{2,}", "\\n")
   .split("\\n");
于 2015-09-03T11:12:43.770 回答