• 締切済み

ソースコードの中から、日本語が使われている行・韓国語が使われている行を抽出したい

あるアプリケーションのソースコード(言語はC#)があります。 このアプリケーションは元々、日本国内で使うものであるため、文字列(ダブルクォーテーションで囲まれているところ)には日本語(漢字、ひらがな、片仮名など)が使われています。 このアプリケーションの韓国語バージョンのソースコードもあります。基本的に、元の日本語バージョンの文字列の中の日本語を韓国語におきかえたものと思われます。(画面コントロールの位置や形などが違ったり、その他微妙な違いはありますが。) 元の日本語バージョンのソースコードから日本語の使われている文字列の行、韓国語バージョンのソースコードから韓国語が使われている文字列の行を探したいと思います。 ダブルクォーテーションが存在する行は秀丸エディタでgrepで探せますが、当然、日本語バージョンであっても文字列には、日本語が含まれていないもの(アルファベットだけとか)があります。 日本語が使われている行だけをgrep(抽出する・探す)したいのですが、どうすればよいですか。 できれば、秀丸を使いたいのですが、他のエディタなどでもかまいません。 それから、逆に、韓国語に置き換えたソースコードから、韓国語(ハングル)が使われている文字列の行だけを抜き出すにはどうすればよいでしょうか。 文字コードは、日本語バージョンも韓国語バージョンもANSIです。 コメント行は要らないので対象外ですが、そのことは考えなくていいです。(もし抽出されてしまっても、対処します。)

noname#8194
noname#8194

みんなの回答

回答No.6

No5ですが、ちょっと訂正です >#""で囲まれた文字列行がなければ次の行 >next if(@array == 0); ↓ #""で囲まれた文字列行がなければ次の行 if(@array == 0) { close ARGV if(eof) ; next; }

回答No.5

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) ; }

noname#86752
noname#86752
回答No.4

秀丸エディタのみで出来るのかわからないのですが、ちょっと思いついた方法を書きます。 日本語ソースと韓国語ソースの違いが文字列中の部分のみなら、そのソースにdiffをかけると日本語が使われている部分と韓国語の部分が抽出されませんか。

noname#8194
質問者

補足

>日本語ソースと韓国語ソースの違いが文字列中の部分のみなら、 質問ではそれらしいことを書いたのですが、実は文字列以外でかなり違いがあります。 しかし、アイディアとしてはとてもいいと思います。 参考にさせていただきます。

noname#30727
noname#30727
回答No.3

つまり、7ビットコード以外が含まれている文字列のある行を表示させたいって事ですよね。 秀丸を使ってないので、なんとも言えないですが、専用ツールを作成したとしても、たいした手間では無いような。

noname#8194
質問者

補足

No.2の補足の続き ".*[^ -~].*" と ".*[^ -~\n\t] の違い。 hoge = "alphabet1234567890"; // コメント のように、""の内側は半角英数だけで、行の最後にコメントがある行の場合(コメントの中にはダブルクォーテーションなし)、 前者は該当しないが、後者は該当する。

  • palmmy
  • ベストアンサー率38% (841/2170)
回答No.2

ANSIで保存されたファイルに対し、それが日本語であるか韓国語であるかの判定は難しいと思います。 http://www.microsoft.com/globaldev/reference/WinCP.mspx DBCSの日本語、韓国語を参照ください。 A0、FD、FEが混じっていたら韓国語、といえるかともいます。(日本語で使わないので)

noname#8194
質問者

補足

No.1の補足で書いた、 ".*[^ -~].*" に関して。 韓国版Windows上で、英語版秀丸で、韓国版ソースを対象に試したら、 以下の問題がありました。 ".*[^ -~].*" これだと期待している一部の行が抜けてしまう。(抽出されない。) 原因はよくわからないが、キャラクタクラス[]の後にダブルクォーテーション ” があると何かだめらしいです。 (コメント行は別として)必ず行内でダブルクォーテーション ” が閉じているはずだと考えれば、grepかけるときには、終わりのダブルクォーテーション ” はあってもなくても同じだろうと思います。 そこで、代わりに ".*[^ -~\n\t] でいいと思う。

  • nuki
  • ベストアンサー率30% (6/20)
回答No.1

先ず初めに、日本語バージョンも韓国語バージョンもANSIと書いてありますが、これは英語版での説明(ANSIとUNICODE)で、日本語の場合はShift JISを指すことは、VC#を使われている方以外には判りにくい事情だと思われます。 (私も大分調べました) で、Shift JISの漢字を検索するためには、大分高機能な正規表現を用いる必要があります。(Perlで実現しているサンプルを参考URLに示しました。) 秀丸の正規表現にも上記の機能があるようですので、試してみる価値はありそうです。 参考URL内の「正規表現とマッチ」の中程に列挙されているものを利用することになります。 申し訳ないのですが、私はテキストエディタに秀丸を使わない人なので確認できていません。動作確認と、できれば結果報告に関してはよろしくお願いします。 また、韓国語に関してもShift JIS同様に文字コードを調査すれば対応可能と思われます。

参考URL:
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
noname#8194
質問者

お礼

ご回答ありがとうございます。 とりあえず、時間をください。

noname#8194
質問者

補足

この問題は、おそらく、文字コードがどうとかいう問題ではなくて、 秀丸で正規表現をどう扱うか、という問題に帰着するような気がしてきます。 どうも秀丸で次のようにすればよいようです。 全ソースファイルから ".*[^ -~].*" で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

関連するQ&A

  • grepで検索行以外の行を抽出する方法

    grepをかけると検索文字列を含む行を抽出しますが 検索文字列を含む行とその前後の行も出力したりできるのでしょうか? よろしくお願いします。

  • ある文字列が含まれた行だけをテキストから抽出→結果を別のテキストに出力

    ある文字列が含まれた行だけをテキストから抽出→結果を別のテキストに出力したいです。 そのために何かいいソフトウェア、または方法は無いでしょうか? これまでは下記サイトを参考に秀丸エディタの検索&glep機能を使ってやってみたのですが、 抽出したい文字列の数が多く手動でやるのに限界を感じたので質問させていただきました。 http://hechimahige.blog71.fc2.com/blog-entry-4.html 秀丸エディタのマクロでも構いません。 よろしくお願いします。

  • ソースコードの1行が長いときの折り返し

    ソースコードを書いていると、1行がとても長くなることがあります。 横スクロールせずに見れるようにしたいのですが、なにか方法はないものでしょうか? 特に、文字列を変数に入れて、連結していくと、度々、1行が長くなってしまいます。 折り返しを意味しながらも、プログラム上は、無視されるような記号、複数行に渡って書いてあるけど、1行と同じですよ~といった意味の記号のようなものはないでしょうか?

    • ベストアンサー
    • PHP
  • 韓国語htmlエディター

    韓国語のhtmlの編集を行うことになったのですが、現在秀丸で編集を行っているのですが、表示させると文字化けしてしまいます。韓国語対応のエディターでお勧めのものを教えてください。よろしくお願いします。

  • 文字列検索(grepのようなもの)のCソースコード知りませんか?

    Cソースコードを探しています。文字列検索用のコードです。UNIXのgrepみたなことができればと思います。 ご存知でしたら教えてください。お願いします。

  • 日本語だけを抽出したい

    SJIS、EUC、UTF8、のどれがくるかわかりませんが、 かつ、その中で、どの言語がくるかわかりませんが、 その中で、日本語だけを、可能な限り容易に判別する方法は ありますでしょうか? また、既存のモジュールを可能な限り使用しない方法でもあります。 #pureperlで書かれていれば、移植はできますが ひらがな、カタカナを抽出すればいいのもありますが、 仮対処にしかならず、漢字だけの場合の抽出が できなくなってしまいます。 以下、参考までに・・ 内部コードがSJIS? #内部コードも、SJIS、EUC、UTF8のどれになるかわかりません。 UTF8の日本語がきたら、SJISになる UTF8の中国語がきたら、化ける(捨てる対象 EUCの日本語が来たら、SJISになる EUCの韓国語がきたら、化ける(捨てる対象) SJISの日本語が来たら、そのまま ・・のような感じになってしまいますので。。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 韓国語の文字コード表

    はじめまして. 私,最近韓国語の勉強を始めたものです. なかでも日本語の文字コードと韓国語の文字コードの関係に興味を持ちまして調べているのですが… 私の調べた限りだと,韓国語の文字コードにはKSCxxxがベースで現在はKSX1001?に発展していると認識しています. どなたか,KSX1001?の文字コード表を扱っているサイト等ご存じの方いらっしゃいますでしょうか?できれば表の画像ファイルではなく,データとして扱える形式で掲載されているところ探しています. 英語韓国語のサイトにあるのでしょうが,まだ不勉強なもので上手く見つけることができません… すみません,どなたかよろしくお願いします!!

  • mhtファイルからの日本語部分の抽出

    wordでmhtファイルとして保存した場合、 保存したファイルをエディタで見ると、 日本語の部分が ㍃ 等になっています。 これらは、文字コードなのでしょうか? 実際には、 これらの部分から、指定した単語を検索して、 置換する、というようなことを実現したいと考えています。 そのため、㍃ 等の部分から日本語の文字列を取得するにはどのようにすればよいのでしょうか?

  • PHPで任意の数の行抽出

    PHPで下記のような文字列がありますが、 この文字列から先頭2行抽出して画面に表示したいのですが、 調べてみてもいい例がありませんでした。 各3種類の改行コードからの各先頭2行抽出方法です。 $a="文字列1\r\n文字列2\r\n文字列3\r\n"; $b="文字列1\r文字列2\r文字列3\r"; $c="文字列1\n文字列2\n文字列3\n";

    • ベストアンサー
    • PHP
  • perlを使用しての特定行抽出について

    何万行も書いてあるテキストファイルがあります。抽出したい文字列の一覧がテキストファイルにまとめられています(文字列は約1000個)。抽出したい文字列は一行にひとつづつ書かれています。何万行も書いてあるテキストファイルから抽出したい文字列と二つ合致したらその行を抽出したいです。ここで、注意していただきたいのが、抽出したい文字列一覧から二つの文字列にヒットした行を抽出したいです。宜しくお願い致します。 何万行も書いてあるテキストファイル aaaaa abc edi bb aert kkkkkkkkkk lllllll ddddd aaaaa anhi kkk    ・・・・・・・・ ・・・・・・・・ 抽出したい文字列一覧のテキストファイル aaaaa bbbbb ddddd iiiiiiiii eeeee ・・・・・ ・・・・・

    • ベストアンサー
    • Perl