こんばんは。
TMemoの最後の無駄な改行を消したいのですが、どうすれば良いですか?
TMemoに入力する際に、最後に複数回Enterしてしまって、
無駄な改行がいくつか入ることがあります。
内容をテキストファイルに保存するまえに、
自動的にこの無駄な改行を消してしまいたいのですが、
「文末だけにある繰り返された改行」を見つける方法がわかりません。
よろしくお願いします。
改行文字かどうかは、
(調べたい箇所の文字1文字を格納した変数) = #13
OR
(調べたい箇所の文字1文字を格納した変数) = #10
の条件判定式で行けるでしょう。
これを文末から文頭に向かって順次条件判定していってやれば
よいかと。
#13#10の意味は検索すればすぐわかると思います。
>無駄な改行
が、Linesプロパティが空の行のことを指しているのなら、
with Memo1 do for i:=Lines.Count-1 downto 0 do if Lines[i]='' then Lines.Delete(i);
で消せます。
Memoのサイズが小さければ、組込関数に任せる方法もありかも。
Memo1.Text := TrimRight(Memo1.Text);
(ただ、この方法では空白やタブも消してしまうので、改行コードのみを扱う場合はTrimRightの処理内容をアレンジする必要がありますが)
誤記です。
>組込関数
組込ではないですね...
既存の関数とでも読み替えてください。
XE またはそれ以降なら、正規表現で消せます。
uses に RegularExpressions を追加して、
Memo1.Lines.Text := TRegEx.Replace(Memo1.Lines.Text, '(\r\n)+$', '', [roMultiLine]);
最後に改行を一つ残すなら、
Memo1.Lines.Text := TRegEx.Replace(Memo1.Lines.Text, '(\r\n)+$', #$0D#$0A, [roMultiLine]);
です。
Delphi 2005〜2010 であれば、SkRegExp / SkRegularExpressions が使えます。
http://skregexp.komish.com/
uses に SkRegularExpressions を追加して使います。
コードは先述のものと全く同じになります。
Rinaさん、DEKOさん横からすみません。
後学のために1つ教えてください。
正規表現で処理すると途中の二重改行も1つになりませんか?
例えば
AAAAAAA
BBBBBBB
が
AAAAAAA
BBBBBBB
になってしまうとか?
横槍ですが、なりませんよ。
Memo1.Textを1つの文字列としてとらえて、文字列の末尾部分に
改行のパターンが連続してあったら空白に置き換えているだけですので。
一応手元のXE3でも試しましたが意図したとおりの動きですね。
あさん、ありがとうございます。
パターン文字$で末尾を表すのでしたね。
で、roMultiLineの指定でテキスト全体の文字列を1行として捉えるわけですね。
勉強になりました。
っていうか、正規表現についてちゃんと勉強しないといけないなぁ。
>あさん、Novさん、DEKOさん、Questさん
色々使えそうなので正規表現でやってみることにしました。
TMemoの中の文字列の後ろに付いた、
無駄な「半角空白、全角空白、改行」を消したかったので、
なんか、とってもスマートでない書き方かもしれませんが、
Memo1.Lines.Text := TRegEx.Replace(Memo1.Lines.Text, '(\r\n+$)|(\s+$)|( +$)', '', [roMultiLine]);
としたところ、消すことができました。
ありがとうございました。
> 正規表現で処理すると途中の二重改行も1つになりませんか?
む。私 roMultiLine って書いてますね。元のコードの意味だと roSingleLine が正しいと思います。
>DEKOさん
roMultiLineとroSingleLineの使い分けがわかりました。
ありがとうございました。
ツイート | ![]() |