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

当前回答

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

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

其他回答

也许这样可以:

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

split = docStr.split("\n");
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正则表达式)方法使用正则表达式。由于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+")。

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

字符串#行()

保存空行不被压扁使用:

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