435

我正在尝试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");
}
4

21 回答 21

825

这应该涵盖您:

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

您真正需要担心的只有两个换行符(UNIX 和 Windows)。

于 2009-01-18T10:18:19.910 回答
164

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

换行匹配器
\R 任何 Unicode 换行序列,等价于 \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

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

如您所见\r\n,它放置在正则表达式的开头,确保正则表达式首先尝试匹配这,并且只有当匹配失败时,它才会尝试匹配单个字符的行分隔符。


因此,如果要在行分隔符上拆分,请使用split("\\R").

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

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

于 2015-06-25T20:25:29.167 回答
139

如果您不想要空行:

String.split("[\\r\\n]+")
于 2009-01-18T10:21:56.283 回答
60
String.split(System.lineSeparator());

这应该是系统独立的

于 2012-07-04T11:10:54.760 回答
22

中的类lines引入了一个新方法,它返回StringStream<String>

返回从该字符串中提取的子字符串流,该字符串由行终止符分区。

可识别的换行符是换行符“\n”(U+000A)、回车符“\r”(U+000D)和回车符后紧跟换行符“\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

字符串#lines()

于 2018-06-28T09:39:43.523 回答
14

在类中有一个JDK11方法:Stringlines()

返回从该字符串中提取的行流,由行终止符分隔。

此外,文档继续说:

行终止符是以下之一:换行符“\n”(U+000A)、回车符“\r”(U+000D)或回车后紧跟换行符“\r \n" (U+000D U+000A)。行是零个或多个字符后跟行终止符的序列,或者是一个或多个字符后跟字符串结尾的序列。行不包括行终止符。

有了这个可以简单地做到:

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

那么如果你想要一个数组:

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

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

于 2018-11-30T23:30:25.177 回答
12

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

对于所有非空行,请使用:

String.split("[\r\n]+")
于 2012-02-17T11:52:48.503 回答
10

这里给出的所有答案实际上都不尊重 Java 对新行的定义,如 BufferedReader#readline 中给出的。Java 正在接受\n,\r\r\n作为新行。一些答案匹配多个空行或格式错误的文件。例如。<sometext>\n\r\n<someothertext>使用时[\r\n]+会产生两行。

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

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

  • 它符合 Java 对新行的定义,例如 BufferedReader 正在使用它
  • 它不匹配多个新行
  • 它不会删除尾随的空行
于 2017-05-19T14:18:29.910 回答
9

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

List<String> lines = new BufferedReader(new StringReader(string))
        .lines()
        .collect(Collectors.toList());
于 2018-03-07T19:51:32.060 回答
7

也许这会起作用:

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

split = docStr.split("\n");
于 2009-01-18T19:27:11.293 回答
5

为了防止空行被压扁,请使用:

String lines[] = String.split("\\r?\\n", -1);
于 2016-06-27T20:06:08.447 回答
4

由于Pshemo响应在 Android 上对我有用,以上答案在 Android 上对我没有帮助。我将在这里留下一些Pshemo 的答案

split("\\\\n")
于 2019-06-19T16:24:08.730 回答
3

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

尝试在最后做 textAreaDoc.insertString(int, String, AttributeSet) ?

于 2009-01-18T10:23:01.787 回答
2

String lines[] =String.split( System.lineSeparator())

于 2016-06-06T16:30:59.123 回答
2

在所有给定解决方案的基础上尝试失败后。我\n用一些特殊的词替换然后拆分。对我来说,以下是诀窍:

article = "Alice phoned\n bob.";
article = article.replace("\\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");

我无法复制问题中给出的示例。但是,我想这个逻辑可以应用。

于 2017-04-11T16:23:35.680 回答
2

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

import com.google.common.base.Splitter;

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

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

于 2017-06-08T09:19:51.157 回答
1

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

  • carriage return+line feed
  • line feed
  • carriage return

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

记事本++

最简单的事情是标准化line feed,然后拆分。

final String[] lines = contents.replace("\r\n", "\n")
                               .replace("\r", "\n")
                               .split("\n", -1);
于 2018-06-18T22:50:10.870 回答
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#lines() https://www.azul.com/90-new -jdk-11 中的功能和 API/

我希望这对某人有帮助。快乐编码。

于 2018-11-23T00:30:38.503 回答
1

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

String::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()))
于 2021-08-20T15:14:50.130 回答
0
  • 试试这个希望对你有帮助

 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");
于 2017-09-14T12:21:55.440 回答
-1
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]);
        }
    }

}
于 2013-10-01T20:23:12.993 回答