用新行分割Java字符串

我试图在JTextArea中使用正则表达式分割文本,通过\n分割字符串,然而,这并不奏效,我也尝试了\r\n|\r|n和许多其他正则表达式组合。 代码:< / p >

public void insertUpdate(DocumentEvent e) {
String split[], docStr = null;
Document textAreaDoc = (Document)e.getDocument();


try {
docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
} catch (BadLocationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}


split = docStr.split("\\n");
}
660765 次浏览

这应该包括你:

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

实际上只需要考虑两个换行符(UNIX和Windows)。

如果你不想要空行:

String.split("[\\r\\n]+")

上面的代码实际上没有做任何可见的事情——它只是计算然后转储计算结果。这是你使用的代码,还是这个问题的一个例子?

尝试执行textAreaDoc。insertString(int, String, AttributeSet)在结束?

也许这样可以:

从split方法的参数中移除双反斜杠:

split = docStr.split("\n");

你不必在字符组中使用双转义字符。

对于所有非空行使用:

String.split("[\r\n]+")
String.split(System.lineSeparator());

这应该与系统无关

package in.javadomain;


public class JavaSplit {


public static void main(String[] args) {
String input = "chennai\nvellore\ncoimbatore\nbangalore\narcot";
System.out.println("Before split:\n");
System.out.println(input);


String[] inputSplitNewLine = input.split("\\n");
System.out.println("\n After split:\n");
for(int i=0; i<inputSplitNewLine.length; i++){
System.out.println(inputSplitNewLine[i]);
}
}


}

String#split​(String regex)方法使用正则表达式。由于Java 8 regex支持\R,它表示(来自模式类文档):

< p > Linebreak匹配器 < br > \R        &emsp \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029] < / p >

所以我们可以用它来匹配:

正如你所看到的,\r\n被放置在regex的开头,这确保了regex将首先尝试匹配这个一对,只有当匹配失败时,它才会尝试匹配单个字符行分隔符。


所以如果你想拆分行分隔符,请使用split("\\R")

如果你不想从结果数组中删除尾随空字符串""使用split(regex, limit)带负的limit参数,如split("\\R", -1)

如果你想将一个或多个连续空行作为单个分隔符,请使用split("\\R+")

String lines[] =String.split( System.lineSeparator())

保存空行不被压扁使用:

String lines[] = String.split("\\r?\\n", -1);

在所有给定解决方案的基础上尝试失败后。我用一些特殊的词替换\n,然后拆分。对我来说,下面的方法很管用:

article = "Alice phoned\n bob.";
article = article.replace("\\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");

我无法复制问题中给出的例子。但是,我想这个逻辑是可以应用的。

这里给出的所有答案实际上都不尊重java对新行的定义,例如BufferedReader#readline。Java接受\n\r\r\n作为新行。一些答案匹配多个空行或格式错误的文件。E . g。当使用__abc4时,<sometext>\n\r\n<someothertext>将导致两行。

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

相比之下,上面的答案具有以下性质:

  • 它符合java对新行的定义,例如BufferedReader正在使用它
  • 它不匹配多个新行
  • 它不移除尾随的空行

作为前面答案的替代,如果要对结果行应用其他操作,如修剪行或过滤空行,可以使用guava的Splitter API:

import com.google.common.base.Splitter;


Iterable<String> split = Splitter.onPattern("\r?\n").trimResults().omitEmptyStrings().split(docStr);

注意,结果是Iterable而不是数组。

  • 试试这个,希望对你有帮助

 String split[], docStr = null;
Document textAreaDoc = (Document)e.getDocument();


try {
docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
} catch (BadLocationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}


split = docStr.split("\n");

如果,出于某种原因,你不想使用String.split(例如,因为正则表达式),而你想在Java 8或更新版本上使用函数式编程:

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

有三种不同的约定(可以说它们是事实上的标准)来设置和显示换行符:

  • __abc0 + __abc1
  • line feed
  • carriage return

在一些文本编辑器中,可以将其中一个替换为另一个:

 notepad++

最简单的方法是归一化为__abc0,然后拆分。

final String[] lines = contents.replace("\r\n", "\n")
.replace("\r", "\n")
.split("\n", -1);

中的String类中引入了一个新方法lines,它返回Stream<String>

返回从已分区的字符串中提取的子字符串流

行终止符识别为换行符“\n”(U+000A),回车 返回"\r" (U+000D)和后面紧跟a的回车 换行"\r\n" (U+000D U+000A).

下面是一些例子:

jshell> "lorem \n ipusm \n sit".lines().forEach(System.out::println)
lorem
ipusm
sit


jshell> "lorem \n ipusm \r  sit".lines().forEach(System.out::println)
lorem
ipusm
sit


jshell> "lorem \n ipusm \r\n  sit".lines().forEach(System.out::println)
lorem
ipusm
sit

String#lines() .

城里来了新男孩,所以你不需要处理所有这些复杂的事情。 从JDK 11开始,只需要写一行代码,它会分割行并返回字符串流。

public class MyClass {
public static void main(String args[]) {
Stream<String> lines="foo \n bar \n baz".lines();
//Do whatever you want to do with lines
}}
< p >参考。 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#lines() https://www.azul.com/90-new-features-and-apis-in-jdk-11/ < / p >

我希望这对一些人有所帮助。快乐的编码。

JDK11中,String类有一个lines()方法:

返回从该字符串中提取的行流,以 行结束符。< / p >

此外,文档继续说:

行结束符是以下之一:换行字符"\n" (U+000A),一个回车字符“\r”(U+000D),或者一个回车 返回后跟换行“\r\n”(U+000D U+000A)。一个 行是0个或多个字符的序列,后跟一个 行结束符,或者它是一个或多个字符的序列 后面跟着字符串的末尾。行不包括行 终结者。< / p >

这一个可以简单地做:

Stream<String> stream = str.lines();

然后如果你想要一个数组:

String[] array = str.lines().toArray(String[]::new);

鉴于此方法返回一个Stream,它为你提供了许多选项,因为它允许你编写简洁的和可能并行操作的声明式表达式。

上面的答案在Android上对我没有帮助,多亏了Pshemo响应,在Android上对我有效。我将在这里留下一些Pshemo的回答:

split("\\\\n")

遗憾的是,Java缺少一种既简单又有效的方法来用固定的字符串分割字符串。String::split和流API都是复杂且相对较慢的。此外,它们可以产生不同的结果。

String::split检查它的输入,然后每次编译到java.util.regex.Pattern(除非输入只包含一个安全的字符)。

然而,Pattern是非常快的,一旦它被编译。所以最好的解决方案是预编译模式:

private static final Pattern LINE_SEP_PATTERN = Pattern.compile("\\R");

然后这样使用它:

String[] lines = LINE_SEP_PATTERN.split(input);

从Java 8开始,\R匹配Unicode指定的任何换行符。在Java 8之前,你可以使用这样的代码:

Pattern.compile(Pattern.quote(System.lineSeparator()))