我试图在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");
}

当前回答

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

返回从此字符串中提取的行流,以 行结束符。

此外,文件继续说:

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

这一个可以简单地做:

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

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

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

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

其他回答

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


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

这应该包括你:

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

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

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

import com.google.common.base.Splitter;

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

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

String.split(System.lineSeparator());

这应该与系统无关