- 締切済み
ソースコードの中から、日本語が使われている行・韓国語が使われている行を抽出したい
あるアプリケーションのソースコード(言語はC#)があります。 このアプリケーションは元々、日本国内で使うものであるため、文字列(ダブルクォーテーションで囲まれているところ)には日本語(漢字、ひらがな、片仮名など)が使われています。 このアプリケーションの韓国語バージョンのソースコードもあります。基本的に、元の日本語バージョンの文字列の中の日本語を韓国語におきかえたものと思われます。(画面コントロールの位置や形などが違ったり、その他微妙な違いはありますが。) 元の日本語バージョンのソースコードから日本語の使われている文字列の行、韓国語バージョンのソースコードから韓国語が使われている文字列の行を探したいと思います。 ダブルクォーテーションが存在する行は秀丸エディタでgrepで探せますが、当然、日本語バージョンであっても文字列には、日本語が含まれていないもの(アルファベットだけとか)があります。 日本語が使われている行だけをgrep(抽出する・探す)したいのですが、どうすればよいですか。 できれば、秀丸を使いたいのですが、他のエディタなどでもかまいません。 それから、逆に、韓国語に置き換えたソースコードから、韓国語(ハングル)が使われている文字列の行だけを抜き出すにはどうすればよいでしょうか。 文字コードは、日本語バージョンも韓国語バージョンもANSIです。 コメント行は要らないので対象外ですが、そのことは考えなくていいです。(もし抽出されてしまっても、対処します。)
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- mr_flogman
- ベストアンサー率62% (5/8)
No5ですが、ちょっと訂正です >#""で囲まれた文字列行がなければ次の行 >next if(@array == 0); ↓ #""で囲まれた文字列行がなければ次の行 if(@array == 0) { close ARGV if(eof) ; next; }
- mr_flogman
- ベストアンサー率62% (5/8)
C#のソースを秀丸(エディタ)を使ってということですので、参考にならないかもしれませが、以下Perl(Unix)でやってみました。 望む回答ではないかもしれませんが、近いものは得られるかもしれません。(windowsにもPerlは入りますし) 考え方としては、 1.””で囲まれた文字列を抽出 2.抽出した文字列で、「ホワイトスペース(タブ、スペース等の空白文字、英数字のみで成り立つ文字列を取り除く。 3.行番号、ファイル名をつけて、対象行を表示する。 ※*/等の記号を含んだ英数字、空白だけの文字だけの行は残ってしまいますが、正規表現を改造すれば対応可。 とすると、以下のようになります。 ○テキスト内容(例が変ですけど。。。^^;) >cat -n aaa.txt 1 aaa"hogehoge11"bbbaaa "hogあああ" bbb 2 aaa"hogあaああ"bbb 3 aaa"あいうえお"bbb 4 aa"1122334hoge"bbbaaa "hogあああ" bbb 5 "aabbcc" 6 "あいうえお一"xxxxx"aaかきくけこaaa" ○実行結果(ファイルは複数指定可です) >y aaa.txt 1:aaa.txt:hogあああ 2:aaa.txt:hogあaああ 3:aaa.txt:あいうえお 4:aaa.txt:hogあああ 6:aaa.txt:あいうえお一#aaかきくけこaaa ○ソース内容 >cat y #!/usr/bin/perl -w use strict; while(<>) { # 改行削除 chomp; # 行番号を保存 my $lineno = $.; #""で囲まれた文字列を抽出 my @array = /"(.+?)"/g; #""で囲まれた文字列行がなければ次の行 next if(@array == 0); my $flg = 0; for( @array ) { # 空白文字及び英数字のみの文字列は対象外 unless(/^[\sa-zA-Z\d]+$/) { # 同一行に対して1度だけ行番号表示 if($. == $lineno) { print $.,":",$ARGV,":"; $lineno = -1; } # 条件に一致した文字列を#で区切って表示 printf "%s#", $_; $flg = 1; } } # 最後の#を取り除く chop; # 該当文字列が1つでも存在した場合は改行 print "\n" if ($flg == 1); close ARGV if(eof) ; }
秀丸エディタのみで出来るのかわからないのですが、ちょっと思いついた方法を書きます。 日本語ソースと韓国語ソースの違いが文字列中の部分のみなら、そのソースにdiffをかけると日本語が使われている部分と韓国語の部分が抽出されませんか。
つまり、7ビットコード以外が含まれている文字列のある行を表示させたいって事ですよね。 秀丸を使ってないので、なんとも言えないですが、専用ツールを作成したとしても、たいした手間では無いような。
補足
No.2の補足の続き ".*[^ -~].*" と ".*[^ -~\n\t] の違い。 hoge = "alphabet1234567890"; // コメント のように、""の内側は半角英数だけで、行の最後にコメントがある行の場合(コメントの中にはダブルクォーテーションなし)、 前者は該当しないが、後者は該当する。
- palmmy
- ベストアンサー率38% (841/2169)
ANSIで保存されたファイルに対し、それが日本語であるか韓国語であるかの判定は難しいと思います。 http://www.microsoft.com/globaldev/reference/WinCP.mspx DBCSの日本語、韓国語を参照ください。 A0、FD、FEが混じっていたら韓国語、といえるかともいます。(日本語で使わないので)
補足
No.1の補足で書いた、 ".*[^ -~].*" に関して。 韓国版Windows上で、英語版秀丸で、韓国版ソースを対象に試したら、 以下の問題がありました。 ".*[^ -~].*" これだと期待している一部の行が抜けてしまう。(抽出されない。) 原因はよくわからないが、キャラクタクラス[]の後にダブルクォーテーション ” があると何かだめらしいです。 (コメント行は別として)必ず行内でダブルクォーテーション ” が閉じているはずだと考えれば、grepかけるときには、終わりのダブルクォーテーション ” はあってもなくても同じだろうと思います。 そこで、代わりに ".*[^ -~\n\t] でいいと思う。
- nuki
- ベストアンサー率30% (6/20)
先ず初めに、日本語バージョンも韓国語バージョンもANSIと書いてありますが、これは英語版での説明(ANSIとUNICODE)で、日本語の場合はShift JISを指すことは、VC#を使われている方以外には判りにくい事情だと思われます。 (私も大分調べました) で、Shift JISの漢字を検索するためには、大分高機能な正規表現を用いる必要があります。(Perlで実現しているサンプルを参考URLに示しました。) 秀丸の正規表現にも上記の機能があるようですので、試してみる価値はありそうです。 参考URL内の「正規表現とマッチ」の中程に列挙されているものを利用することになります。 申し訳ないのですが、私はテキストエディタに秀丸を使わない人なので確認できていません。動作確認と、できれば結果報告に関してはよろしくお願いします。 また、韓国語に関してもShift JIS同様に文字コードを調査すれば対応可能と思われます。
お礼
ご回答ありがとうございます。 とりあえず、時間をください。
補足
この問題は、おそらく、文字コードがどうとかいう問題ではなくて、 秀丸で正規表現をどう扱うか、という問題に帰着するような気がしてきます。 どうも秀丸で次のようにすればよいようです。 全ソースファイルから ".*[^ -~].*" でgrepをかける。(★1) これでもういいような気もするが、コメント行の中にもダブルクォーテーションがあるかもしれない。 出てきた結果から、以下のようにしてコメント行を除く。 コメントは、「//以降、行末まで」(★2)か /* */で囲まれているところである。 //が使われていて行がすべてコメントである行を取り除くことにする(行の後ろにコメントがくっついている行はそのまま残す) には、秀丸の置換で、検索文字列に ^.+\(.+\): [\t ]*//.*\n と入れて、置換文字列には何も入れない。 更に、1行内で /* */ が完結する行を ^.+\(.+\): [\t ]*/\*.*\*/[\t ]*\n で、置換で取り除く。 複数行に渡る /* */ のコメント行に一発で対処するには私の手には負えないので、次のようにする。 全ソースファイルから、grepで /* を含む行を抽出する。 grepの結果から、1行内で /* */ が完結するところを置換で取り除く。 あとは、手動で対処する。 (なんか情けないけど。) 日本語版ではどうもこれでいいようです。 韓国語版は試していないが、おそらく同様でいいと思います。 ====================== ★1 [ -~] 任意の1バイト文字(半角空白" "から"~"まで)にヒット。 [^ -~] ^ を使って否定すると、1バイト文字以外のものにヒットする。 半角の片仮名や全角のアルファベットや改行文字やタブなどにもヒットするようだ。 ".*[^ -~].*" ダブルクォーテーションで囲まれている部分に1バイト文字以外の文字があるとき。 1バイト文字以外の文字が1文字でもあればヒットさせる(前後に何があってもよい。)ので、".*"を使っている。 ★2 「//以降、行末まで」というのは、 //.*$ である。置換で1行丸ごと消すときは、改行文字まで消してよいと思うので、 $ではなくて\nを使っている。 ====================== 参考 "秀丸エディタQ&A集" の中 http://homepage2.nifty.com/jr-kun/hidemaru_qa/4_regulr.html
補足
>日本語ソースと韓国語ソースの違いが文字列中の部分のみなら、 質問ではそれらしいことを書いたのですが、実は文字列以外でかなり違いがあります。 しかし、アイディアとしてはとてもいいと思います。 参考にさせていただきます。