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

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

当前回答

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

回车+换行 换行 回车

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

最简单的方法是归一化到换行,然后拆分。

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

其他回答

城里新来了一个男孩,所以你不需要处理所有这些复杂的事情。 从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
}}

一些参考。 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html(行) https://www.azul.com/90-new-features-and-apis-in-jdk-11/

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

也许这样可以:

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

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

这应该包括你:

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

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

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

对于所有非空行使用:

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

java-11中的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

字符串#行()