如何按换行符拆分字符串? [复制]

Posted

技术标签:

【中文标题】如何按换行符拆分字符串? [复制]【英文标题】:How Do I Split A String By Line Break? [duplicate] 【发布时间】:2012-11-08 00:47:53 【问题描述】:

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

非常感谢任何帮助

【问题讨论】:

您显示输出,而不向我们显示输入,这无济于事。 这意味着您的输入不包含\n 字符,因此不会拆分字符串。检查输入是否包含\r\n(例如来源来自MS windows) @JScoobyCed 请检查我的编辑我在返回结果之前将 \n 添加到我的字符串中,因此它包含 \n 你的意思是“$.alpha\nbravo\ncharlie some text”吗?因为你现有的输出没有任何意义。 复制***.com/questions/454908/… 【参考方案1】:

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

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

【讨论】:

这不适用于 Mac 中的文本,其中行终止符是 \r 我认为可以根据操作系统来决定终结者。上述解决方案仅适用于 Windows IMO。 yourString.split(System.lineSeparator()); @adn.911: System.lineSeparator() 依赖于平台,因此只有在知道输入中的行分隔符时才能使用它。 短:"\r?\n|\r"【参考方案2】:

这有点矫枉过正,但您可以使用标准 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() method。 另请注意closing a StringReader 没有太多好处。 @jaco0646 - 是的,Java 8 确实让它变得更容易了一些。我将更新我的答案以表明这一点。谢谢。至于关闭StringReader,那只是我在自动驾驶仪上(完成后关闭任何流)。我很惊讶我没有把整个事情都放在try/finally 声明中。 :)【参考方案3】:

使用 Apache commons 帮助类 StringUtils。

平台无关方式:

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

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

我没有成功。我应该尝试在换行之前按最后一个字符分割还是类似的东西? 如果您没有成功,您的输入可能不包含新行。或许你可以发布 `result.getBytes()' 的内容? 如果你想处理 "\r" "\n" "\r\n" "\n\r" 的所有组合,你可以使用:Splitter.on(CharMatcher.anyOf(" \n\r")).omitEmptyStrings().split(yourstring); (请注意,这也会删除空行,这可能是也可能不是您想要的)【参考方案5】:
Matcher m = Pattern.compile("(^.+$)+", Pattern.MULTILINE).matcher(fieldContents);

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

【讨论】:

【参考方案6】:

我提出以下sn-p,它与PC和Mac端线样式都兼容。

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

【讨论】:

使用此解决方案,输入中的空白行将消失。

以上是关于如何按换行符拆分字符串? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如果字符串包含多个 \n,如何在每 25 个换行符(\n)上拆分一个字符串

在换行符和逗号上拆分字符串[重复]

在 .NET 中以换行符拆分字符串的最简单方法?

python复制的文本到控制台,\n失效问题?

如何在 Java 中用逗号和换行符 (\n) 分割字符串? [复制]

C# 无法通过换行符将字符串拆分为数组(来自 StreamReader)