- ベストアンサー
正規表現で全角数字を半角数字に置換する方法は?
- テキスト内の全角数字5桁のみを該当の半角数字5桁に置換する方法を探しています。
- 正規表現を使用して置換することができますが、具体的な置換後の文字列がわかりません。
- テキストエディタでの置換が難しい場合は、VBScriptなどのプログラミング言語を使用することも考えています。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
No.4 & No.5 です。 質問文中の「のみ」を見逃していました。 6桁や10桁は変換してはいけないのですね。 方法を考えてみたのですが、やや手順が長くなってしまいました。 なお、テキストファイルを処理するので表は存在しないものとしています。 (存在する場合は単語の先頭や末尾を考慮する必要がある) 1.全角数字以外にはさまれた全角数字5文字を変換する (1) 検索でワイルドカード使用 (2) 検索する文字列は「[!0-9][0-9]{5}[!0-9]」 (3) 「検索先」「メイン文書」を順にクリック (マクロの記録中ならここでいったん閉じて再び検索) (4) 検索する文字列を「[0-9]{5}」にする (5) 「検索先」「現在の選択」を順にクリック (6) 閉じる (7) 半角に変換 これで文頭以外は変換できるはずです。 2.文頭 文頭に全角数字5文字がある場合、それより前に文字がないため上記手順では選択されません。 そこで、(2)の検索する文字列を「<[0-9]{5}[!0-9]」にしてもう一度上記手順を実行するか、いっそのこと手動で選択して半角に変換するか等を行う必要があります。 何度も使用するなら記録マクロにしておけばよいと思います。 ところで、サクラエディタはマクロとしてWSHが使用可能だと聞いたことがあります。 ということは、たとえばNo.6様提示のソースを改造したり、VBScriptで書いたりしてマクロとして使用してもよいのではないでしょうか。
その他の回答 (7)
- Gotthold
- ベストアンサー率47% (396/832)
そういえばサクラエディタはWSH(js,vbs)が使えましたね。 サクラエディタでやるならこれでできると思います。 ------------------------------------ var convTable = { "0":0, "1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9 }; var text_a = Editor.GetSelectedString(0); var text_b = text_a.replace(/([^0-9]|^)([0-9]{5})(?=[^0-9]|$)/g, function ($0,$1,$2){ return $1 + $2.replace(/[0-9]/g , function(s){return convTable[s];}) ; } ); Editor.InsText(text_b); ------------------------------------ 使い方は、上記マクロを拡張子.jsで保存してサクラエディタに登録し、 サクラエディタ上で置換したい範囲を選択(全文ならCtrl+A)した状態で、 このマクロを実行してください。 あと、"あいうえお01234か01234きくけこ" のように 0-9以外の文字が1文字だけ間にある場合に置換できなかったので少しパターンを修正しました。
お礼
ご回答ありがとうございます。 修正コード拝見いたしました。 とても参考になります。 ほんと、「ありがとうポイント10Pt」っていうのはどこいっちゃったんでしょうかね?笑 進呈させてください!10Pt!
- Gotthold
- ベストアンサー率47% (396/832)
JScriptならreplaceメソッドの置換後テキストに関数を使えるからまだ書きやすいかな。 replace メソッド http://msdn.microsoft.com/ja-jp/library/cc409988.aspx ------------------------------ var convTable = { "0":0, "1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9 }; var text_a = "あいうえお01234かきくけこ99さしすせそ123456ああ"; var text_b = text_a.replace(/([^0-9]|^)([0-9]{5})([^0-9]|$)/g, function ($0,$1,$2,$3){ return $1 + $2.replace(/[0-9]/g , function(s){return convTable[s];}) + $3 ; } ); WScript.Echo(text_b); ------------------------------ PowerShellの-replace 演算子も、置換後文字列に処理が書けるみたいなので やろうと思えばできるのではないかと思います。
お礼
ご回答ありがとうございます。 これは・・・イイですねぇ。 コードも書いてくださって、助かります。 個人的にですが、ありがとうポイント10Pt差し上げますm(_ _)m
- queuerev2
- ベストアンサー率78% (96/122)
Word2007の文字種の変換は、リボンでは 「ホーム」タブ-「フォント」グループの中にあります。 「上付き」の右です。 ショートカットキーは Alt H 7 (2003互換では Alt O E)です。
補足
ご回答ありがとうございます。 できました! 丁寧に教えてくださって誠に感謝しております。 ただ、今度は下記のような現象になってしまいます。 ---------- あいうえお01234かきく99けこ555555さしすせそ0123456789たちつ ↓ あいうえお01234かきく99けこ555555さしす0123456789たちつ ---------- 1)6桁が頭から5桁分だけヒットして、そこだけ変換する羽目になる 2)10桁続いていた場合、5桁+5桁と認識されて、変換する羽目になる これはもうどうしようもないですかね・・・^^;?
- queuerev2
- ベストアンサー率78% (96/122)
質問者様のご期待に添えるかどうかはわかりませんが、思いつくところを答えさせていただきます。 1.Word等を使う このような処理はMicrosoft Word等のワープロで行うとよいのではないでしょうか。 Word2007であれば、 検索→検索オプションを表示→「ワイルドカードを使用する」をチェック→検索する文字列は「[0-9]{5}」→「検索先」「メイン文書」を順にクリック→閉じる→文字種の変換で半角に でできます。(正規表現ではなくワイルドカードですが) OpenOffice.org Writer等の互換ソフトでもおそらく同様のことができると思います。 2.VBScript以外のプログラミング言語 C#やVB(.NET以降)で使用できるRegEx.Replaceメソッドでは、マッチした文字列を加工して置換後の文字列として使用することができるようです。 下記のリンク先では、それを利用して全角から半角への変換を行っています。 http://www.atmarkit.co.jp/fdotnet/dotnettips/1051anhankaku/anhankaku.html 3.VBScriptを使うとすると VBScriptだとマッチと変換を繰り返すのでしょうか。そうであるなら正規表現置換一発よりはかなりややこしくなりそうですね。でも全角と半角の変換なので変換後の文字列にはマッチしないこともありそれほど複雑にはならないのではないでしょうか。 全角半角変換もBASP21といったライブラリやVBScriptでの記述例があるようです。
補足
ご回答ありがとうございます。 とりえあずすぐできそうな(1)をやってみたのですが、、、 すごく実現したいことに近い気がします!! ただ、分からなかったので、補足欄にて質問です。 >~→文字種の変換で半角にでできます。 これってどうすればできますか?? (その手前までやって、検索ウィンドウ閉じたらヒット文字列が選択されている状態です) 当方Microsoft Office Word 2007です。 何卒よろしくお願いいたします。
- ki-aaa
- ベストアンサー率49% (105/213)
#2のものです。 前の答えは間違っています。 Sub 全角数字5桁のみを該当の半角数字5桁に置換す() Dim k As Long Dim aaa As String, bbb As String Dim re As Object aaa = "あいうえお12345かきくけこ99さしす9951せそ" & _ "あああ95142いいい1234567ううう1江23尾" 'test data Debug.Print "●●● " Debug.Print aaa Set re = CreateObject("VBScript.RegExp") re.Global = True re.Pattern = "([^0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([^0-9])" aaa = re.Replace(aaa, "$1$2■$3■$4■$5■$6■$7") '■は、変換される文字に絶対現れない文字にする Debug.Print aaa For k = 0 To 9 bbb = CStr(k) re.Pattern = StrConv(bbb, vbWide) & "■" aaa = re.Replace(aaa, bbb) Next k Debug.Print aaa Set re = Nothing End Sub
お礼
度々ご回答ありがとうございます。 少し手直しされたようですね。 こちらで試させてもらいます。
- ki-aaa
- ベストアンサー率49% (105/213)
こんにちわ 面白そうだったので、EXCEL.VBAで試してみました。 Sub 全角数字5桁のみを該当の半角数字5桁に置換す() Dim k As Long Dim aaa As String, bbb As String Dim re As Object aaa = "あいうえお12345かきくけこ99さしす9951せそ" & _ "あああ95142いいい1234567ううう1江23尾" 'test data Debug.Print "●●● " Debug.Print aaa Set re = CreateObject("VBScript.RegExp") re.Global = True re.Pattern = "[^0-9]([0-9])([0-9])([0-9])([0-9])([0-9])[^0-9]" aaa = re.Replace(aaa, "$1■$2■$3■$4■$5■") '■は、変換される文字に絶対現れない文字にする Debug.Print aaa For k = 0 To 9 bbb = CStr(k) re.Pattern = StrConv(bbb, vbWide) & "■" aaa = re.Replace(aaa, bbb) Next k Debug.Print aaa Set re = Nothing End Sub
お礼
ご回答ありがとうございます。 VBAも考えてみたのですが、操作対象のファイル数が多い&内容量も多いのでちょっと諦めてました。 というかめんどくさかったというか・・・ けれどやりようによっちゃあ、ご提示のソースが役に立つかもしれません(^^) >'■は、変換される文字に絶対現れない文字にする これだけは・・・難しいですね。 ひらがな、漢字は当然無理ですし、場合によっては■や◆や★が内容に含まれています。。。 いっそ漢字でめっっちゃ難しくて本当に本当に使われないような漢字を探して、 それを使用するのもいいかもしれないですね。 (例えば癮とか麑とか・・・読み方も分かりません。笑) ちょっと試してみます!(うまくいけば後ほどベストアンサーにするかもです。かも、です。)
- kmee
- ベストアンサー率55% (1857/3366)
パターンの一部をそのまま参照するようなものは多いのですが、大文字小文字/全角半角といった変換や計算までできるのは、ほとんどありません。 Perlはその「計算結果で置換できる」側の言語な上に、その気になれば1行でできるくらいなのですが、Windows標準には入っていないので、環境作りが面倒かもしれません
お礼
ご回答ありがとうございます。 VBScriptだとごちゃごちゃになってしまうので、私もPerlを考えました。 しかし開発環境・使用環境を考えて二の足を踏んでます。 >その気になれば1行でできるくらいなのですが そうですか。驚きです。あまりPerlに詳しくないもので^^; 暇を見つけて、自宅でPerlの検証をしてみようかと思います。
お礼
ご回答ありがとうございます。 補足に答えて下さって感謝です。 おかげさまで実現したいことが可能となりました。 今回はあまりテキスト内を操作したくなかったこともあり、 Wordの検索&半角機能を使用することとします。