- ベストアンサー
秀丸の正規表現(1バイト文字,2バイト文字の表現)
「英文-日本文」がセットになったデータがあります。これを英文と日本文の間で切り分けたいと思っています。Perlなどを使えばより簡単かもしれませんが、Perlはあまり知らないので、秀丸の正規表現でやりたいと思っています。そこで、1バイト文字、2バイト文字の表現の仕方が必要になってくると思うのですが、どう書いたらいいのでしょうか。 (参考データ) This is a pen. これはペンです。 を This is a pen. /// これはペンです。 のようにしたいです。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
> 第3水準の「・」まででも大丈夫かも。 ほらインターネットじゃ文字化けしちゃった・・・ \f[\ -~]\f[、-熙] これの「熙」を別の文字に変えてください。 IMEパッドの「文字一覧」を起動。 漢字一覧を一番下までスクロール。 「・」が連続してますが、そこから上へちょっと戻ると漢字がでてきます。 私はWindowsXP IME2002(8.1.4004.0)ですが、シフトJISの0xfc4bの文字が一番最後の漢字みたいです。 「熙」をその文字に変えてみてください。
その他の回答 (10)
- Bo_Bo
- ベストアンサー率65% (97/149)
>文頭に///が入ったり、[ や ] の前後に///が入ったり、/// が2つ以上入る行が多かったです。 これは予想していた結果です。そこから寄せられる補足を参考に、完成形に近づけようと考えていました。 “[ や ] の前後に・・・”これ [] は1バイトの文字ですよね? 英文と言うのを何を指しているのかを、まだ理解できません。 参考となる元の文章(十行程度)と、こうなって欲しい(こうならないで欲しい)結果を提示してもらえると回答しやすいのですが。特に半角の記号や空白の扱い。 (場合によっては、マクロを組めるかも) よく分からないので、正規表現パターンの例。 [\x20-\x7E] ==> 制御コード以外のASCII文字(半角空白からチルダ (~)まで) [0-9A-Za-z] ==> 英数字 [_A-Za-z]+ ==> 英単語( \w ) [■-●] ==> 2バイト文字 ■は全角空白 ●はIMEパットの文字一覧を表示して、一番最後までスクロールします。その後、徐々にスクロール・アップして黒にそっくりな漢字が出てきたらそれです。(OKWebでこの漢字をはじかれる)
お礼
ありがとうございました。 みなさんにたくさん回答、アドバイスを頂いたので、締め切りたいと思います。質問の仕方が悪く、さらにマクロや正規表現の基本的なことも十分に分からないまま質問して申し訳ありませんでした。みなさん本当に丁寧にありがとうございました。m(__)m
- Bo_Bo
- ベストアンサー率65% (97/149)
ANo.#7 の Bo_Bo です。 >秀丸のマクロは使ったことがないので、正規表現を使った置換でお願いできますか。 ANo.#7 で回答したマクロは、「正規表現を使った置換」です。(完成形ではありませんが) "[\x20-\x7E]+" とあるのが正規表現で、英文の半角空白からチルダ (~)まで ( !"#$%&'()*+,-./0~9:;<=>?@A~Z[\]^_`a~z{|}~ ) を表しています。 適当なファイルを開いて、「検索」メニューから「置換」とし、 検索欄に ==> [\x20-\x7E]+ 置換欄に ==> ///\0/// 「正規表現」にチェック 「置換の前に確認」にチェック として、試しに実行してみてください。英文が "///" で挟み込まれると思います。 (マクロは単にこれを表しているだけです。) しかし、これには不備な点があります。 「英文と日本文の間で切り分けたい」と言うのを、何を「英文」とし、何を「日本文」とするかで不具合が出る可能性があります。 「日本文」と解釈して欲しい文の中に、半角の空白、括弧や円記号などがあると、正しい置き換えが出来ません。 何かの規則性が見つかれば、もう少しお役に立てるかもしれません。 (英文は必ず行頭から始まるとか、日本文は行の最後に記述されているとか)
お礼
ありがとうございます。 まず、前回の発言大変失礼しました。正規表現の基礎が分かっているという言葉も撤回させて下さい。[\x20-\x7E]+という表現の仕方、知らなかったです。実行させてみましたが、文頭に///が入ったり、[ や ] の前後に///が入ったり、///が2つ以上入る行が多かったです。 すみませんが、質問の内容を少し変更させて下さい。「1バイト文字、2バイト文字を漏れなく正規表現で表すにはどうすればいいのですか。」これでお願いできますか。これが僕の知りたいことなのに、僕の質問の仕方が悪いせいで、みなさんに非常に迷惑をかけているようです。「何かの規則性が見つかれば」ということですが、不規則なものも多く、それがANo.#7のお礼で「後でみなさんに頂いた答えをデータに合わせて少し編集すると思います」と言った理由です。まず1バイト文字と2バイト文字を漏れなく表現する方法が分かれば、実行しながらうまくいかないところは修正することができます。最初は、逆に追加していく方法でやっていたのですが、どんどん記号が並び、見るからに汚い正規表現になってしまいました。さらにまだまだ漏れがありそうです。ちなみに英文は必ず行頭から始まるかどうかですが、英文で始まるものと日本文で始まるものの両方がありますが、分けてやります。「日本文-英文」となっているものは、「英文-日本文」で使う正規表現の左右を逆にしてやればいいので簡単だと思います。 となれば、既に答えは出ていますか?
- Bo_Bo
- ベストアンサー率65% (97/149)
ANo.#7 の回答を訂正します。 // ASCII 文字列を '///' で囲む $sb = searchbuffer; #so = searchoption; $rb = replacebuffer; disabledraw; replaceallfast "[\x20-\x7E]+", "///\\0///", regular; // 半角空白からチルダ '~' まで //replaceallfast "[\x21-\x7E]+", "///\\0///", regular; // 半角空白を含まないバージョン enabledraw; setsearch $sb, #so; setreplace $rb; endmacro;
- Bo_Bo
- ベストアンサー率65% (97/149)
取りあえず、以下のマクロでどうでしょうか。 // ASCII 文字列を '///' で囲む $sb = searchbuffer; #so = searchoption; $rb = replacebuffer; replaceallfast "[\x20-\x7E]+", "///\\0///", regular; // 半角空白からチルダ '~' まで //replaceallfast "[\x21-\x7E]+", "///\\0///", regular; // 半角空白を含まないバージョン setsearch $sb, #so; setreplace $rb; endmacro;
お礼
ありがとうございます。 秀丸のマクロは使ったことがないので、正規表現を使った置換でお願いできますか。たぶん後でみなさんに頂いた答えをデータに合わせて少し編集すると思います。マクロだと、それが出来ないので、正規表現の方がありがたいです。でもこのマクロも後で参考にしてみます。それと、なぜか今まで「補足」に「お礼」を書いていたのですが、「お礼」に訂正です。
> 漢字の終わりは数パターンあり、どれを採用していいのか分かりませんでした。 「熙」は第2水準の最後の文字です。(だったと思います) IMEの文字パレットで確認してみてください。(Shift-JIS) さらにその後ろにもNEC外字やIBM外字などもあります。カッコ株なんてのもありますね。 扱いたい文書の使用環境が狭いのであれば(Windowsであれば)第3水準の「・」まででも大丈夫かも。
補足
ありがとうございます。 正規表現で表すとどうなりますか? すみませんがお願いします。
これではどうでしょうか。 検索:\f[\ -~]\f[、-熙] 置換:\1///\2
補足
ありがとうございます。 [\ -~]で記号を含む全ての1バイト文字(半角)、[、-熙]で全ての2バイト文字(全角)が表せているということですね? 参考までに、1バイトの記号とは、例えば、?!'";:-[]などです。2バイトの記号とは、例えば、「《〔…―などです。他の方と漢字の終わりの文字が違いますが、どうなんでしょう。ネットで調べていても、漢字の終わりは数パターンあり、どれを採用していいのか分かりませんでした。
- coco1
- ベストアンサー率25% (323/1260)
ちょっと訂正です。 置換前:^[a-zA-Z \?!\.]+\f[ぁ-椀、。]+
- coco1
- ベストアンサー率25% (323/1260)
英文が文字だけでなく記号やスペースもあることを考慮する必要がありますが、基本的には次の構文でいいでしょう。 置換前:^[a-zA-Z ].+\f[\?\!\.][ぁ-椀]+ 置換後:\0///\1 ちなみに 置換前:大文字小文字のアルファベット、空白を数文字含み「.か?か!」で終わっている文字列と日本語の文字列を、「.か?か!」の前後で\0と\1の要素に分ける 置換後:検索結果の\0と\1を///で結ぶ という構文です。 その他の区切り文字がある場合には[\?\!\.]の中にその要素を追加してやればいいでしょう。 helpにわかりやすい解説があります。とりあえずこれで試してみて下さい。コツがわかると思います。
補足
ありがとうございます。 そうです。そういうのが知りたいのです。(^^) ちなみに正規表現の基本は理解していますし、自分なりに作ったりして試してもいます。だからコツは分かっています。但し、データは、10や100の量ではないので、一つ一つ見て調べて[\?\!\.]の中に追加していくというやり方は、ちょっと無理です。記号を含めて1バイト文字全てと2バイト文字全てを表す式が分かればありがたいです。
- taknt
- ベストアンサー率19% (1556/7783)
秀丸のヘルプに正規表現について 詳しく書かれてありますが、それは 読んだでしょうか? [a-z^0-9] とすると 半角の小文字アルファベットとカレットと半角の数字にマッチします。 これぐらいしか 該当しそうなのは なさそうですね。
補足
秀丸のヘルプは読みました。ネットでも調べて自分なりにも作ったりはしているのですが、全然自信が無いので聞いています。秀丸で漏れなく(全角、半角の記号も全て含めて)1バイト、2バイトを表す方法が分かればありがたいです。ネットで調べて簡単に出てこないということは、難しいかもしれません。
- taknt
- ベストアンサー率19% (1556/7783)
この場合は、正規表現を使わないで ただの置換としたらいいでしょう。 . を . /// に置換するだけですね。
補足
早速のお答えありがとうございます。 でも、これはあくまで参考データを一文だけ取ってきただけで、もっとたくさん多様なデータがあります。"?""!"などで終わっている文もあれば、文になっていないフレーズ、つまり英単語で終わっているものもあります。全てのデータ形態を説明し切れませんが、知りたいのは、秀丸の正規表現で1バイト文字、2バイト文字を表現する方法、さらにできれば実際にそれを使っての置換の仕方です。だからたぶんお答えを頂いた後、自分のデータに合わせてそれを少し編集しないといけないと思います。宜しくお願い致します。
お礼
ありがとうございます。 インターネット上で表現できない文字であれば、答えようがないですよね。(^^; MS-IMEへの切り替え方が分からないので、後で頑張ってみます。ATOK14を使っていまして、タスクバーにIME切り替え用のアイコンが無いです (ちなみに韓国語IMEも入っていて、それにはATOKパレット上から切り替えられます)。さらにATOKで文字一覧を出そうとしたのですが、ATOKパレットには、最小限の機能しか表示されておらず(ATOKパレットが短く、伸ばすボタンも無い)、ATOKパレット上で右クリックしても「最小化」「透明化」「テキストラベル」「縦置き」「タスクバーの追加アイコン」「設定」の6つしか出てきません。この質問の内容から外れるので、解決できなかったら、また別で質問します。m(__)m