web-dev-qa-db-ja.com

Java文字列を改行で分割

正規表現を使用して文字列を\nで分割するJTextAreaでテキストを分割しようとしていますが、これは機能せず、\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");
}
356
dr.manhattan

これはあなたをカバーするはずです:

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

あなたが心配する必要があるのは本当に2つの改行(UNIXとWindows)だけです。

664
cletus

空行が不要な場合は、

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

splitメソッドは正規表現(正規表現)を使用しています。 Java 8正規表現は( Patternクラスのドキュメント から)を表す\Rをサポートしていますので:

改行マッチャー
\R任意のUnicode改行シーケンス。\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]と同等です。

それで我々はそれをマッチするために使うことができます:

ご覧のように\r\nはregexの先頭に置かれ、これはregexが最初にこのpairにマッチしようとすることを確実にし、そしてそのマッチが失敗した場合に限ってsingle character行セパレータにマッチしようとします。


したがって、行区切り文字で分割したい場合はsplit("\\R")を使用してください。

もしそうなら 結果の配列の末尾に空の文字列を削除したくない場合は""split(regex, limit)のように負のlimitパラメータを付けてsplit("\\R", -1)を使用してください。

1つ以上の空白行を単一の区切り文字として処理したい場合は、split("\\R+")を使用します。

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

これはシステムに依存しない

44
Shervin Asgari

文字グループの中で二重のエスケープ文字を使う必要はありません。

空でないすべての行に対して、

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

多分これはうまくいくでしょう:

Splitメソッドのパラメータから二重円記号を削除します。

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

Java-11linesクラスに新しいメソッド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

文字列#lines()

6
Anton Balaniuc

JDK11では、Stringクラスはlines()メソッドを持ちます。

この文字列から抽出された行のストリームを、行末記号で区切って返します。

さらに、 ドキュメンテーション は次のように言います。

改行文字は、次のいずれかです。改行文字 "\ n"(U + 000A)、復帰文字 "\ r"(U + 000D)、または復帰とそれに続く改行 "\ r\n "(U + 000D U + 000A)です。行は、0個以上の文字のシーケンスとそれに続く行終了文字、または1個以上の文字の後に続くストリングの最後のいずれかです。行には行終了記号は含まれません。

これを使えば簡単にできること:

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

もしあなたが配列が欲しいなら:

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

このメソッドがStreamを返すとすると、 concise と並列処理の宣言式を記述できるようになるので、多くの選択肢があります。

5
Aomine

ここに与えられたすべての答えは、実際にはJavasの新しい行の定義を尊重しません。 BufferedReader#readline Javaは改行として\n\rおよび\r\nを受け入れています。いくつかの答えは複数の空の行または不正な形式のファイルに一致します。例えば。 <sometext>\n\r\n<someothertext>を使用するときの[\r\n]+は、2行になります。

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

これとは対照的に、上記の答えには次のような性質があります。

  • javasの新しい行の定義に準拠しています。 BufferedReaderが使用している
  • 複数の改行とは一致しません
  • 末尾の空行は削除されません。
5
Till Schäfer

空行が押しつぶされないようにするには、次のようにします。

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

上記のコードは実際には目に見えるものは何もしていません - それは単にcalcualtesしてから計算をダンプします。あなたが使ったコードなのか、それともこの質問のほんの一例なのか。

最後にtextAreaDoc.insertString(int、String、AttributeSet)を試してみますか?

3
Chii

何らかの理由でString.splitを使用したくない場合(例えば 正規表現 のため)、Java 8以降で関数型プログラミングを使用したい場合は、次のようにします。

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

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

1
husayt

与えられたすべての解決策に基づいて失敗した試みの後。 \nを特別なWordに置き換えてから分割します。私にとっては、次のようなトリックがありました。

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

質問の例を再現できませんでした。しかし、私はこの論理が適用できると思います。

1
kravi

これまでの答えに代わるものとして、他の操作が結果の行に適用されることになっている場合、guavaのSplitter APIを使用することができます。

import com.google.common.base.Splitter;

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

結果は配列ではなくIterableです。

1
Thomas Naskali
  • これがあなたにとって役に立つことを願ってみてください

 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");
0
Vishal Yadav

改行を設定して表示するには、3つの異なる規則(それらが 事実上 標準であると言える)があります。

  • 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);
0
Paul Vargas

Androidで Pshemo の応答があったため、上記の回答はAndroidでは役に立ちませんでした。 Pshemoの答え の一部をここに残します:

split("\\\\n")
0
clasher

町には新しい男の子がいるので、上記の複雑さすべてに対処する必要はありません。 JDK 11以降 では、単一行のコードとして記述するだけで済みます。行が分割され、Stream of Stringが返されます。

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新機能とjdk-11のapis / -

これが誰かに役立つことを願っています。ハッピーコーディング.

0
Red Boy