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

当前回答

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

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

其他回答

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

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

也许这样可以:

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

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

保存空行不被压扁使用:

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

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

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

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

字符串#行()