如何按换行符拆分字符串? [复制]
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)上拆分一个字符串