気まま日記(kimamanikki)

気の向くままに、のんびり更新しますヽ(´∀`)ノ

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
05


スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

空白行を削除する

空白行削除する正規表現について。

今XMLを生成してて、その際出来てしまう空白行削除するようにする正規表現を色々と調べてみたんだけど、一般的なものは

^[  \t]+(\n|\r|\n\r|\r\n)

みたい。

確かにこれで空白行はマッチできるんだけど…

Java上で空白行をマッチさせて置換するっていう場合だと、これでは足りない。
あと改行コードって機種依存が面倒くさいよね…

例えば


String str =
"<aaa>aaa</aaa>\n" +
"\n" +
"\n" +
" <bbb>bbb</bbb>\n" +
"\t\n" +
" <ccc>ccc</ccc>\n" +
" \n" +
"<ddd>ddd</ddd>\n";



<aaa>aaa</aaa>


 <bbb>bbb</bbb>

 <ccc>ccc</ccc>

<ddd>ddd</ddd>


なんて文字列の場合、先頭の<aaa>aaa</aaa>の前だけに^[  \t]+部分が適応されてしまい、それ以降の空白文字(半角スペース・全角スペース・タブ文字)に対してのマッチングが行われない。

つまり生成した文字列strの『文頭』は<aaa>aaa</aaa>の前だけとなってしまう。

Java上で実行してみたのは


str = str.replaceAll("^[  \t]+(\n|\r|\n\r|\r\n)", "");


これで実行すると全く反応しない…

「どうすりゃいいんだ…」

と、悩んでいた所、あることに思いつく。

「先頭に限らず、連続する改行(空白文字を含まない空白行)を先に削除したらいいんじゃね?」

という事で、空白行を一度で削除するんじゃなくて以下の通りに行うようにしてみる。

1.連続する改行コードを一つにまとめる
2.空白行をマッチさせ、改行コードを削除する

コードとしては、


// 2つ以上連続した改行コードを1つにまとめる
str = str.replaceAll("(\n|\r|\n\r|\r\n){2,}", "\n");

// 空白行をマッチさせて削除する
str = str.replaceAll("[ \t\\x0B\f]+(\n|\r|\n\r|\r\n)", "");


こうする事でまず連続する改行(半角・全角スペースやタブ文字を含まない空白行)を削除

その後空白が連続して1個以上ある場合かつその後に改行がある場合(半角・全角スペースやタブ文字を含む空白行)の場合に対象行を削除

と言う風にしてみると…

「出来た~☆」

でもまぁとりあえずまだ問題はあるんだけどね…
問題は『ちゃんとした文字を含む行の末尾が空白文字で終わっている』場合、2のパターンに引っかかってしまうという事。

まぁ今現在は確実に入らないからいいんだけどね…

あ、でも空文字に置き換わるだけだから別にいいのか。

まぁでももうちょっと正規表現勉強しないとな~…

テーマ : プログラミング    ジャンル : コンピュータ


Comments

かつて講義でプログラムを弄ったことはあるのですけど、ぜんぜん分かりません(泣)

本当にこういうのがぱっと分かる人っているのでしょうかね?もしいるのならあごがれちゃいます。
>フィアナさん
以前現場でいたんですよ。
その凄い人が。
秀丸エディター使ってあっという間に正規表現で置換していくんです。
あれは凄かった…

masaも今回の事がパッとできなかったのが悔しかったんで、正規表現の本買ってきちゃいました。

勉強しなきゃ~…

Leave a Comment


Body

カウンター
セルフィ

 
Twitter



 
 
クラッチ作品集
 
 
プロフィール

クラッチ

気まま日記バナー

・クラッチ
このブログの管理人

 
 
管理人へメール
メールフォームを開く
 
 
ブロとも申請フォーム
 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。