あるアプリケーションのソースコード(言語はC#)があります。
このアプリケーションは元々、日本国内で使うものであるため、文字列(ダブルクォーテーションで囲まれているところ)には日本語(漢字、ひらがな、片仮名など)が使われています。
このアプリケーションの韓国語バージョンのソースコードもあります。基本的に、元の日本語バージョンの文字列の中の日本語を韓国語におきかえたものと思われます。(画面コントロールの位置や形などが違ったり、その他微妙な違いはありますが。)
元の日本語バージョンのソースコードから日本語の使われている文字列の行、韓国語バージョンのソースコードから韓国語が使われている文字列の行を探したいと思います。
ダブルクォーテーションが存在する行は秀丸エディタでgrepで探せますが、当然、日本語バージョンであっても文字列には、日本語が含まれていないもの(アルファベットだけとか)があります。
日本語が使われている行だけをgrep(抽出する・探す)したいのですが、どうすればよいですか。
できれば、秀丸を使いたいのですが、他のエディタなどでもかまいません。
それから、逆に、韓国語に置き換えたソースコードから、韓国語(ハングル)が使われている文字列の行だけを抜き出すにはどうすればよいでしょうか。
文字コードは、日本語バージョンも韓国語バージョンもANSIです。
コメント行は要らないので対象外ですが、そのことは考えなくていいです。(もし抽出されてしまっても、対処します。)
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
先ず初めに、日本語バージョンも韓国語バージョンもANSIと書いてありますが、これは英語版での説明(ANSIとUNICODE)で、日本語の場合はShift JISを指すことは、VC#を使われている方以外には判りにくい事情だと思われます。
(私も大分調べました)
で、Shift JISの漢字を検索するためには、大分高機能な正規表現を用いる必要があります。(Perlで実現しているサンプルを参考URLに示しました。)
秀丸の正規表現にも上記の機能があるようですので、試してみる価値はありそうです。
参考URL内の「正規表現とマッチ」の中程に列挙されているものを利用することになります。
申し訳ないのですが、私はテキストエディタに秀丸を使わない人なので確認できていません。動作確認と、できれば結果報告に関してはよろしくお願いします。
また、韓国語に関してもShift JIS同様に文字コードを調査すれば対応可能と思われます。
参考URL:http://homepage1.nifty.com/nomenclator/perl/shif …
この回答への補足
この問題は、おそらく、文字コードがどうとかいう問題ではなくて、
秀丸で正規表現をどう扱うか、という問題に帰着するような気がしてきます。
どうも秀丸で次のようにすればよいようです。
全ソースファイルから
".*[^ -~].*"
で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_ …
No.2
- 回答日時:
ANSIで保存されたファイルに対し、それが日本語であるか韓国語であるかの判定は難しいと思います。
http://www.microsoft.com/globaldev/reference/Win …
DBCSの日本語、韓国語を参照ください。
A0、FD、FEが混じっていたら韓国語、といえるかともいます。(日本語で使わないので)
この回答への補足
No.1の補足で書いた、
".*[^ -~].*"
に関して。
韓国版Windows上で、英語版秀丸で、韓国版ソースを対象に試したら、
以下の問題がありました。
".*[^ -~].*"
これだと期待している一部の行が抜けてしまう。(抽出されない。)
原因はよくわからないが、キャラクタクラス[]の後にダブルクォーテーション ” があると何かだめらしいです。
(コメント行は別として)必ず行内でダブルクォーテーション ” が閉じているはずだと考えれば、grepかけるときには、終わりのダブルクォーテーション ” はあってもなくても同じだろうと思います。
そこで、代わりに
".*[^ -~\n\t]
でいいと思う。
No.3
- 回答日時:
つまり、7ビットコード以外が含まれている文字列のある行を表示させたいって事ですよね。
秀丸を使ってないので、なんとも言えないですが、専用ツールを作成したとしても、たいした手間では無いような。
この回答への補足
No.2の補足の続き
".*[^ -~].*"
と
".*[^ -~\n\t]
の違い。
hoge = "alphabet1234567890";// コメント
のように、""の内側は半角英数だけで、行の最後にコメントがある行の場合(コメントの中にはダブルクォーテーションなし)、
前者は該当しないが、後者は該当する。
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) ;
}
No.6
- 回答日時:
No5ですが、ちょっと訂正です
>#""で囲まれた文字列行がなければ次の行
>next if(@array == 0);
↓
#""で囲まれた文字列行がなければ次の行
if(@array == 0) {
close ARGV if(eof) ;
next;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 世界情勢 韓国の言語は日本由来? 7 2022/03/30 17:15
- 日本語 漢字ひらがなカタカナと使える日本人って凄いですよね、というか日本語って凄いですよね? 中国とか韓国語 2 2022/11/11 09:22
- 日本語 中国語と日本語とでは、どちらが先に漢字を廃止するでしょうか? 2 2023/01/29 13:45
- 韓国語 韓国で新聞の社・誌名とかその他で 漢字が使われますが、 3 2023/03/16 09:36
- その他(社会科学) やはり、日本は 大韓民国から全て学ばなければ成り立たない国なんでしょうか 大韓民国のおかげで日本は国 14 2023/07/05 19:58
- 日本語 日本語は韓国語から発展したらしいですよね?漢字→ハングル→ひらがなになったらしいですよね?つまりは日 9 2022/04/23 13:29
- 日本語 ある言語を外国語として学習した場合、 1 2022/05/22 14:48
- アジア 台湾への韓国人旅行者は増えたのでしょうか? 1 2023/05/08 17:58
- Google+ とっても古いスマホですが、お聞きしたいです。 iPhone8プラスですが、Googleの検索文字を入 3 2023/08/06 08:59
- 政治 韓国人は日本人の顔を見ると怒りがこみ上げるから、マスクをするか、顔を整形せよと言ってますか? 1 2022/11/17 10:21
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELで=より左の文字を一括で...
-
エクセルで文字列をtxtファイル...
-
エクセルでアルファベットか数...
-
Excelで指数表現しないようにす...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
sedなどで、特定の文字列の後の...
-
C言語で文字列の中の文字列のカ...
-
Left関数とRight関数を合わせた...
-
アクセスで特定の数字以外(複...
-
Excelで3E8を3.00E+8にしない方...
-
【Excel VBA】複数ある特定の文...
-
マクロ処理でのループの記述に...
-
VBA2005 16進を2桁で表示したい。
-
Excelで偶数行だけ文字列を数え...
-
VBScript 数値の少数化
-
MS SQLServer のSQLで文字列の...
-
エクセルで文字列の最大値を抽...
-
StringGridで選択した箇所の文...
-
textboxユーザーコントロールの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
Excelで3E8を3.00E+8にしない方...
-
VBAでの Replace関数で、ワイル...
-
Excelで指数表現しないようにす...
-
[C言語]fputsとfprintfの違い
-
エクセルで文字列をtxtファイル...
-
同一セル内に関数と文字列を同...
-
エクセルで文字列の最大値を抽...
-
Excelはなんで先頭の0を消すん...
-
MS SQLServer のSQLで文字列の...
-
エクセル 数値データを桁をそ...
-
Left関数とRight関数を合わせた...
-
VBA2005 16進を2桁で表示したい。
-
VBの「As String * 128」とは?
-
Msgboxの×が押されたとき
-
sedなどで、特定の文字列の後の...
-
【Excel VBA】複数ある特定の文...
-
OnTime 使用時のプロシージャへ...
おすすめ情報