どのように私はWindowsとLinuxで動作するような方法でJavaの文字列からすべての改行を置き換えることができますか(すなわち、キャリッジリターン/ラインフィード/ニューラインなどのOS特有の問題がない)
試してみました(readFileAsStringはテキストファイルを文字列に読み込む関数です)。
String text = readFileAsString("textfile.txt");
text.replace("\n", "");
しかしこれはうまくいかないようです。
どうすればこれができますか?
text
をtext.replace()
の結果に設定する必要があります。
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");
これは文字列が不変であるために必要です。replace
を呼び出しても元の文字列は変更されず、変更された新しいものが返されます。結果をtext
に代入しないと、その新しいStringは失われ、ガベージコレクトされます。
どんな環境でも改行文字列を取得することに関して - それはSystem.getProperty("line.separator")
を呼び出すことによって利用可能です。
他の回答で述べたように、String.replace(...)
はターゲット文字列を変更しないので、あなたのコードは主に動作していません。 (できません - Javaの文字列は不変です!)実際に行うことは、必要に応じて文字を変更して新しい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", " ");
これは各行の終端文字をスペースに置き換えます。
現在のOSで有効な行終端文字だけを削除したい場合は、次のようにします。
text = text.replaceAll(System.getProperty("line.separator"), "");
行区切り文字を確実に削除したい場合は、次のようにします。
text = text.replaceAll("\\r|\\n", "");
または、もう少し冗長ですが、正規表現は少なくなります。
text = text.replaceAll("\\r", "").replaceAll("\\n", "");
この関数 は、改行を含むすべての空白を単一の空白に正規化します。元々の質問が求めていたものではありませんが、多くの場合必要とされるものを正確に実行する可能性があります。
import org.Apache.commons.lang3.StringUtils;
final String cleansedString = StringUtils.normalizeSpace(rawString);
str = str.replaceAll("\\r\\n|\\r|\\n", " ");
一行おきに失敗して、たくさん検索した後、私のために完璧に働きました。
これは効率的だと思います
String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")
構文ハイライト表示用に編集
改行はwindows/linux/macでは同じではありません。属性line.separatorと共に System.getProperties を使用する必要があります。
String text = readFileAsString("textfile.txt").replaceAll("\n", "");
Oracle Webサイトでのtrim()の定義は「先頭と末尾の空白を省略した文字列のコピーを返します」です。
ドキュメントでは、改行文字(先頭と末尾の文字)も削除されるとは述べていません。
要するにString text = readFileAsString("textfile.txt").trim();
もあなたのために働くでしょう。 (Java 6で確認済み)
あなたはあなたのファイルを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()
は返される文字列に行末記号を含まないことに注意してください。上記のコードでは、行の最後の単語と次の行の最初の単語を接着しないようにスペースを追加しています。
String text = readFileAsString("textfile.txt").replace("\n","");
.replaceは新しい文字列を返します。Javaの文字列は不変です。
(Apache) StringUtils がここでまだカバーされていなかったのは奇妙なことです。
.replace
メソッドを使用して、文字列からすべての改行(またはそれ以外の部分文字列の出現)を削除できます。
StringUtils.replace(myString, "\n", "");
この行はすべての改行を空の文字列に置き換えます。
改行は技術的には文字なので、文字を置き換える.replaceChars
メソッドをオプションで使用できます。
StringUtils.replaceChars(myString, '\n', '');
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);
汎用メソッドを使用して、任意の文字を任意の文字に置き換えることができます。
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++;
}
}
あなたが同時の複数行の改行を単一の改行に置き換えたい場合は、参考にしてください。
myString.trim().replaceAll("[\n]{2,}", "\n")
または1つのスペースに置き換える
myString.trim().replaceAll("[\n]{2,}", " ")