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

26

我是安卓开发的新手,我试图通过多个换行符将一个字符串分割多次。我要分割的字符串从数据库查询中提取,构造如下:

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"

非常感谢任何帮助


你只展示了输出,却没有展示输入,这并没有帮助。 - CommonsWare
1
这意味着您的输入不包含\n字符,因此字符串没有被分割。检查输入是否包含\r\n(如果源来自MS Windows等)。 - JScoobyCed
我更新了问题。请确保那是正确的意外输出。 - Jherico
我刚刚尝试使用您发布的代码构建了一个“result”,然后进行了拆分,结果完美无缺。您确定您发布的代码是产生这些结果的吗? - Ted Hopp
2
请将Java字符串按换行符拆分的问题的解决方案复制到此处:https://dev59.com/OHRB5IYBdhLWcg3w9L3n - Vadzim
显示剩余4条评论
6个回答

60

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

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

12
这对于来自Mac的文本不起作用,因为行终止符是\r - Ted Hopp
我认为可以根据操作系统来确定终止符。以上解决方案仅适用于Windows。 - B. S. Rawat
1
你觉得你的String.split(System.lineSeparator())怎么样? - adn.911
1
@adn.911:System.lineSeparator() 是依赖于平台的,因此只有在您知道输入中将使用哪个行分隔符时才可以使用它。 - Xdg
短代码:"\r?\n|\r" - Leponzo

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);

在Java 8中,这甚至更简单了,因为它添加了一个lines()方法 - jaco0646
请注意,关闭StringReader没有太多好处。 - jaco0646
@jaco0646 - 是的,Java 8 确实使它变得更容易了。我会更新我的答案来展示这一点。至于关闭 StringReader,那只是我在自动驾驶时做的(处理完流后关闭任何流)。我很惊讶我没有把整个东西放到一个 try/finally 语句中 :) - Ted Hopp

5

使用Apache commons辅助类StringUtils。

跨平台的方法:

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

与平台相关的方法。也许会快一些,但我不认为这很重要。

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


2
如果可能的话,我建议使用Guava Splitter和Joiner类来代替String.split。但即使如此,在声明正则表达式时确保正确转义非常重要。我不确定"\n"是否会被Java中的正则表达式编译器正确解释,但我也不确定它是否会。覆盖所有可能的行尾是棘手的,因为多个连续的EOL标记可能会破坏匹配。我建议:
String [] separated = result.replaceAll("\\r", "").split("\\n");

我尝试了很多方法都没有成功。我应该尝试在换行符前将文本按最后一个字符进行分割吗? - B. Money
如果您没有成功,那么您的输入可能不包含换行符。也许您可以发布 result.getBytes() 的内容? - Jherico
5
如果你想处理"\r" "\n" "\r\n" "\n\r"的所有组合,你可以使用以下代码:Splitter.on(CharMatcher.anyOf("\n\r")).omitEmptyStrings().split(yourstring);(请注意,这也会删除空行,这可能是你想要的,也可能不是) - joe p

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

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

0
我提供以下代码片段,它兼容PC和Mac的行尾样式。
String [] separated = result.replaceAll("\\r", "\\n")
   .replaceAll("\\n{2,}", "\\n")
   .split("\\n");

使用这个解决方案,输入中的空行将会消失。 - Ted Hopp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接