按新行拆分Java字符串

时间:2009-01-18 10:13:56

标签: java regex split newline

我正在尝试使用正则表达式在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");
}

20 个答案:

答案 0 :(得分:666)

这应该包括你:

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

您只需要担心两个新行(UNIX和Windows)。

答案 1 :(得分:123)

如果您不想要空行:

String.split("[\\r\\n]+")

答案 2 :(得分:96)

split方法正在使用正则表达式(正则表达式)。由于Java 8正则表达式支持\R代表(来自documentation of Pattern class):

  

Linebreak matcher
  \ R任何Unicode换行序列,相当于   \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

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

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

因此,如果您想在线分隔符上使用split("\\R")

如果don't want to remove from resulting array trailing empty strings "" split(regex, limit)使用limit参数为split("\\R", -1),请使用split("\\R+")

如果您想将一个或多个连续的空行视为单个分隔符,请使用echo "<a onclick=\"waitingDialog($(this).parents('form'),'/index.php/Taxbrowser_Taxonpage?taxon={$tie}')\"><em>{$tie}</em></a></br>";

答案 3 :(得分:44)

String.split(System.getProperty("line.separator"));

这应该是系统无关的

答案 4 :(得分:11)

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

对于所有非空行使用:

String.split("[\r\n]+")

答案 5 :(得分:7)

也许这会奏效:

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

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

答案 6 :(得分:7)

中的lines类中引入了新方法String,该方法返回Stream<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

String#lines()

答案 7 :(得分:5)

JDK11中,String类具有lines()方法:

  

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

此外,documentation继续说:

  

换行符是以下之一:换行符“ \ 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,它提供了很多选项,因为它使您可以编写简洁和可能并行操作的声明式表达式。

答案 8 :(得分:5)

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

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

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

  • 它符合Javas对新行的定义,例如BufferedReader正在使用它
  • 它与多个新行不匹配
  • 它不会删除尾随空行

答案 9 :(得分:4)

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

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

答案 10 :(得分:3)

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

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

答案 11 :(得分:3)

如果出于某种原因,您不想使用String.split(例如,因为regular expressions)并且您希望在Java 8或更新版本上使用函数式编程:

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

答案 12 :(得分:1)

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

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

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

答案 13 :(得分:1)

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

import com.google.common.base.Splitter;

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

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

答案 14 :(得分:1)

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

答案 15 :(得分: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");

答案 16 :(得分:0)

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

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

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

Notepad++

最简单的方法是规范化为line feed然后拆分。

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

答案 17 :(得分:0)

镇上有一个新男孩,因此您不需要处理所有上述复杂性。 从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-features-and-apis-in-jdk-11/

我希望这会对某人有所帮助。编码愉快。

答案 18 :(得分:0)

由于Pshemo在Android上对我有用,因此上述答案对Android没有帮助。我将在这里留下Pshemo's answer的一部分:

split("\\\\n")

答案 19 :(得分:-2)

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

}