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

当前回答

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

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

其他回答

这应该包括你:

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

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

遗憾的是,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()))

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

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

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

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

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

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

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

Linebreak匹配器 \R任何Unicode换行符序列,相当于 (\ \ u000D \ u000A | u000A \ u000B \ u000C \ u000D \ u0085 \ u2028 \ u2029]

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

\u000D\000A -> \r\n对 \u000A ->换行(\n) \u000B ->行制表(不要与字符制表\t混淆,t是\u0009) \u000C -> form feed (\f) \u000D ->回车(\r) \u0085 -> next line (NEL) \u2028 ->分割线 \u2029 ->段分隔符

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


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

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

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