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");

気にする必要があるのは、実際には 2 つの改行 (UNIX と Windows) だけです。

于 2009-01-18T10:18:19.910 に答える
164

String#split​(String regex)メソッドは regex (正規表現) を使用しています。Java 8 regex は( Pattern class のドキュメント\Rから) を表すものをサポートしているため:

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

したがって、それを使用して一致させることができます。

ご覧のとおり\r\n、正規表現の先頭に配置されているため、正規表現が最初にこのペアと一致しようとし、その一致が失敗した場合にのみ、1 文字の行区切り文字と一致しようとします。


したがって、行セパレーターで分割する場合は、 を使用しますsplit("\\R")

結果の配列から末尾の空の文字列を削除したくない""場合は、 のようなsplit(regex, limit)limitのパラメーターを使用しますsplit("\\R", -1)

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 に答える
12

文字グループでエスケープ文字を二重にする必要はありません。

空でないすべての行には、次を使用します。

String.split("[\r\n]+")
于 2012-02-17T11:52:48.503 に答える
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 に答える
3

上記のコードは、実際には目に見えることは何もしません。計算してから計算をダンプするだけです。使用したコードですか、それともこの質問の単なる例ですか?

最後に textAreaDoc.insertString(int, String, AttributeSet) を実行してみてください。

于 2009-01-18T10:23:01.787 に答える
1

悲しいことに、Java には、文字列を固定文字列で分割する単純かつ効率的な方法がありません。とストリーム API はどちらString::splitも複雑で、比較的低速です。また、それらは異なる結果を生み出す可能性があります。

String::splitjava.util.regex.Pattern入力を検査し、毎回にコンパイルします(入力に安全な char が 1 つしか含まれていない場合を除く)。

ただし、コンパイルするPatternと非常に高速です。したがって、最善の解決策は、パターンをプリコンパイルすることです。

private static final Pattern LINE_SEP_PATTERN = Pattern.compile("\\R");

次に、次のように使用します。

String[] lines = LINE_SEP_PATTERN.split(input);

Java 8 以降、\RUnicode で指定された任意の改行に一致します。Java 8 より前は、次のようなものを使用できました。

Pattern.compile(Pattern.quote(System.lineSeparator()))
于 2021-08-20T15:14:50.130 に答える
-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 に答える