2

改行を含む文字列から要素を取り出す必要がある Java クラスを作成しました。最初のステップとして、コードは入力文字列を改行で分割し、結果を配列に配置する必要があります。これは、特定のケースを除いてすべて正常に機能しています。次のコードを使用して分割を実行しています。

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

私が抱えている問題は、次の行にあります。

##INFO=<ID=DS,Number=0,Type=Flag,Description=""removed?"">"

結果は次の 2 行になります。

##INFO=<ID=DS,Number=0,Type=Flag,Description=""removed
"">"

クエスチョンマークで分かれています。なぜこれが起こっているのか、誰かが私を正しい方向に向けることができますか? 正規表現の中には「?」はありません。0 または 1 回の出現を示しますか? これは、改行で分割する受け入れ可能な方法ではありませんか?

4

3 に答える 3

0

これは機能します。単純に \n\r OR \n と言います。

String manyLines = "line1\nline2\n\rline3?\nline4";
System.out.println(Arrays.asList(manyLines.split("\\n\\r|\\n")));

出力

[line1, line2, line3?, line4]
于 2013-02-17T09:27:23.223 に答える
0

角括弧内のクエスチョン マークは、文字通りクエスチョン マークです。角かっこを丸かっこに置き換えます (前者は、各代替に対して 1 文字に制限されます)。

String lines[] = inputText.split("(\\r?\\n|\\r)+");

行は「\r\n」、「\n」、「\r」で分割されますが、実質的には次と同じです。

String lines[] = inputText.split("(\\n|\\r)+");

したがって、角括弧に戻ることができます。

String lines[] = inputText.split("[\\n\\r]+");

実際に必要なのは、OS に応じて一定の改行である場合:

String lines[] = inputText.split("(" + System.getProperty("line.separator") + ")+");
于 2013-02-17T09:29:19.053 に答える
0

[]括弧内の任意の文字を意味する文字 class( ) を使用しているため、この場合、 , , ,のいずれかを 1 回以上 (+)[\\r?\\n\\r]+を意味します。\\r\\n?\\r

Unicode UTS #18: Unicode Regular Expressionsで定義されている、改行の実際の移植可能な正規表現は次のとおりです。

\R => (?:(?>\u000D\u000A)|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])

Perlで有名なTom Christiansenによるこの回答で説明されているように。Java の二重エスケープ (文字列の次に正規表現) の説明:

(?:(?>\\u000D\\u000A)|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029])
于 2013-02-17T09:32:06.360 に答える