285

WindowsとLinuxで機能するように(つまり、キャリッジリターン/改行/改行などのOS固有の問題がないように)Javaの文字列からすべての改行を置き換えるにはどうすればよいですか?

私が試しました(readFileAsStringはテキストファイルを文字列に読み込む関数であることに注意してください):

String text = readFileAsString("textfile.txt");
text.replace("\n", "");

しかし、これはうまくいかないようです。

これはどのように行うことができますか?

4

17 に答える 17

483

text次の結果に設定する必要がありますtext.replace()

String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");

文字列は不変であるため、これが必要です。呼び出しreplaceても元の文字列は変更されず、変更された新しい文字列が返されます。結果をに割り当てないとtext、その新しい文字列は失われ、ガベージコレクションが行われます。

任意の環境で改行文字列を取得することに関しては、。を呼び出すことで利用できますSystem.getProperty("line.separator")

于 2010-01-29T15:47:18.237 に答える
250

他の回答に記載されているように、String.replace(...)にターゲットを変更しないため、コードは機能していませんString。(できません-Java文字列は不変です!)実際に行うことは、必要に応じて文字が変更された新しいオブジェクトreplaceを作成して返すことです。Stringしかし、あなたのコードはそれを捨てますString...


考えられる解決策は次のとおりです。どちらが最も正しいかは、正確に何をしようとしているかによって異なります。

// #1
text = text.replace("\n", "");

すべての改行文字を削除するだけです。これは、WindowsまたはMacの回線終了には対応していません。

// #2
text = text.replace(System.getProperty("line.separator"), "");

現在のプラットフォームのすべてのラインターミネータを削除します。これは、(たとえば)WindowsでUNIXファイルを処理しようとしている場合、またはその逆の場合には対応していません。

// #3
text = text.replaceAll("\\r|\\n", "");

すべてのWindows、UNIX、またはMacのラインターミネータを削除します。ただし、入力ファイルがテキストの場合、これは単語を連結します。例えば

Goodbye cruel
world.

になります

Goodbye cruelworld.

したがって、実際にこれを実行することをお勧めします。

// #4
text = text.replaceAll("\\r\\n|\\r|\\n", " ");

これは、各ラインターミネータをスペース1に置き換えます。Java 8以降、これも実行できます。

// #5
text = text.replaceAll("\\R", " ");

また、複数行のターミネータを1つのスペースに置き換えたい場合:

// #6
text = text.replaceAll("\\R+", " ");

1-#3と#4の間には微妙な違いがあることに注意してください。シーケンス\r\nは単一の(Windows)ラインターミネータを表すため、2つのスペースに置き換えないように注意する必要があります。

于 2010-01-29T16:07:52.030 に答える
33

この関数は、改行を含むすべての空白を単一のスペースに正規化します。元の質問が正確に求めていたものではありませんが、多くの場合、必要なことを正確に実行する可能性があります。

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);
于 2017-04-28T22:38:32.437 に答える
25

現在のOSで有効なラインターミネータのみを削除する場合は、次のようにします。

text = text.replaceAll(System.getProperty("line.separator"), "");

行区切り文字を確実に削除する場合は、次のように実行できます。

text = text.replaceAll("\\r|\\n", "");

または、少し冗長ですが、レゲキシーは少なくなります。

text = text.replaceAll("\\r", "").replaceAll("\\n", "");
于 2010-01-29T15:52:20.517 に答える
14

これは効率的だと思います

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")
于 2013-03-09T17:16:02.320 に答える
13
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

1行おきに失敗して、たくさん検索した後、私にとっては完璧に機能しました。

于 2014-07-25T16:38:57.450 に答える
6

改行は、windows / linux/macでは同じではありません。System.getPropertiesを属性line.separatorとともに使用する必要があります。

于 2010-01-29T15:49:43.573 に答える
4
String text = readFileAsString("textfile.txt").replaceAll("\n", "");

Oracle Webサイトでのtrim()の定義は「文字列のコピーを返しますが、先頭と末尾の空白は省略されています」です。

ドキュメントでは、改行文字(先頭と末尾)も削除されるとは記載されていません。

要するに String text = readFileAsString("textfile.txt").trim();あなたのためにも働くでしょう。(Java 6でチェック)

于 2012-08-31T04:27:34.647 に答える
3
String text = readFileAsString("textfile.txt").replace("\n","");

.replaceは新しい文字列を返します。Javaの文字列は不変です。

于 2010-01-29T15:49:26.447 に答える
3

を使用してファイルを読み取ることをお勧めしますBufferedReader。このクラスは、入力を個々の行に分割でき、自由に組み立てることができます。この方法BufferedReaderは、現在のプラットフォームに関係なく、Linux、Windows、およびMacOSの世界の行末規則を自動的に認識します。

したがって:

BufferedReader br = new BufferedReader(
    new InputStreamReader("textfile.txt"));
StringBuilder sb = new StringBuilder();
for (;;) {
    String line = br.readLine();
    if (line == null)
        break;
    sb.append(line);
    sb.append(' ');   // SEE BELOW
}
String text = sb.toString();

readLine()返される文字列に行末記号が含まれていないことに注意してください。上記のコードは、行の最後の単語と次の行の最初の単語が結合しないようにスペースを追加します。

于 2010-01-29T16:57:26.780 に答える
1

(Apache) StringUtilsがまだここでカバーされていないのは奇妙だと思います。

.replaceこのメソッドを使用して、文字列からすべての改行(またはその他の部分文字列の出現)を削除できます。

StringUtils.replace(myString, "\n", "");

この行は、すべての改行を空の文字列に置き換えます。

.replaceChars改行は技術的には文字であるため、オプションで文字を置き換えるメソッドを使用できます

StringUtils.replaceChars(myString, '\n', '');
于 2016-07-02T13:45:12.250 に答える
1

Kotlinでは、またJava 11以降Stringlines()複数行の文字列で行のリストを返すメソッドがあります。すべての行を取得して、それらを1つの文字列にマージできます。

Kotlinを使用すると、次のように簡単になります。

str.lines().joinToString("")
于 2021-06-29T18:18:47.697 に答える
0

apache commons IOUtilsを使用して、行を反復処理し、各行をStringBuilderに追加できます。そして、InputStreamを閉じることを忘れないでください

StringBuilder sb = new StringBuilder();
FileInputStream fin=new FileInputStream("textfile.txt");
LineIterator lt=IOUtils.lineIterator(fin, "utf-8");
while(lt.hasNext())
{
  sb.append(lt.nextLine());
}
String text = sb.toString();
IOUtils.closeQuitely(fin);
于 2016-01-21T21:22:21.020 に答える
0

参考までに、同時の複数の改行を単一の改行に置き換えることができる場合は、次を使用できます。

myString.trim().replaceAll("[\n]{2,}", "\n")

または、単一のスペースに置き換えます

myString.trim().replaceAll("[\n]{2,}", " ")
于 2016-09-19T13:44:04.313 に答える
0

ジェネリックメソッドを使用して、任意の文字を任意の文字に置き換えることができます。

public static void removeWithAnyChar(String str, char replceChar,
        char replaceWith) {
    char chrs[] = str.toCharArray();
    int i = 0;
    while (i < chrs.length) {

        if (chrs[i] == replceChar) {
            chrs[i] = replaceWith;
        }
        i++;
    }

}
于 2017-03-31T05:00:16.767 に答える
-1

org.apache.commons.lang.StringUtils#chopNewline

于 2018-05-22T05:42:55.147 に答える
-2

これを試してみてください:

 textValue= textValue.replaceAll("\n", "");
 textValue= textValue.replaceAll("\t", "");
 textValue= textValue.replaceAll("\\n", "");
 textValue= textValue.replaceAll("\\t", "");
 textValue= textValue.replaceAll("\r", "");
 textValue= textValue.replaceAll("\\r", "");
 textValue= textValue.replaceAll("\r\n", "");
 textValue= textValue.replaceAll("\\r\\n", "");
于 2012-11-09T10:18:05.970 に答える