プロが教えるわが家の防犯対策術!

いつもお世話になっております。

テキスト内の全角数字5桁のみを該当の半角数字5桁に置換する方法を探しています。

OS:Win
テキストエディタ:sakuraエディタ、秀丸

例)
----------------------------------------
あいうえお01234かきくけこ99さしすせそ

あいうえお01234かきくけこ99さしすせそ
----------------------------------------

正規表現で行えばいいと思い、置換文字列を
 [0-9][0-9][0-9][0-9][0-9]
あるいは
 [0-9]{5}
にしましたが、置換後の文字列が分かりません。

試しに検索で上記の文字列を試すと、該当箇所がマークされるので、
置換前の文字列は合っています。

置換後の文字列をご教授願えますでしょうか。


※テキストエディタで無理ならプログラム組みます。
VBScriptを考えていますが、他に良い言語があれば併せて教えてください。

A 回答 (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で書いたりしてマクロとして使用してもよいのではないでしょうか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

補足に答えて下さって感謝です。
おかげさまで実現したいことが可能となりました。

今回はあまりテキスト内を操作したくなかったこともあり、
Wordの検索&半角機能を使用することとします。

お礼日時:2012/12/13 10:47

そういえばサクラエディタは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文字だけ間にある場合に置換できなかったので少しパターンを修正しました。
    • good
    • 3
この回答へのお礼

ご回答ありがとうございます。

修正コード拝見いたしました。
とても参考になります。

ほんと、「ありがとうポイント10Pt」っていうのはどこいっちゃったんでしょうかね?笑
進呈させてください!10Pt!

お礼日時:2012/12/13 10:45

JScriptならreplaceメソッドの置換後テキストに関数を使えるからまだ書きやすいかな。



replace メソッド
http://msdn.microsoft.com/ja-jp/library/cc409988 …
------------------------------
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 演算子も、置換後文字列に処理が書けるみたいなので
やろうと思えばできるのではないかと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

これは・・・イイですねぇ。
コードも書いてくださって、助かります。

個人的にですが、ありがとうポイント10Pt差し上げますm(_ _)m

お礼日時:2012/12/12 11:46

Word2007の文字種の変換は、リボンでは


「ホーム」タブ-「フォント」グループの中にあります。
「上付き」の右です。

ショートカットキーは Alt H 7 (2003互換では Alt O E)です。
「正規表現で全角数字を半角数字に置換する方」の回答画像5

この回答への補足

ご回答ありがとうございます。

できました!
丁寧に教えてくださって誠に感謝しております。

ただ、今度は下記のような現象になってしまいます。

----------
あいうえお01234かきく99けこ555555さしすせそ0123456789たちつ

あいうえお01234かきく99けこ555555さしす0123456789たちつ
----------
1)6桁が頭から5桁分だけヒットして、そこだけ変換する羽目になる
2)10桁続いていた場合、5桁+5桁と認識されて、変換する羽目になる

これはもうどうしようもないですかね・・・^^;?

補足日時:2012/12/12 11:43
    • good
    • 0

質問者様のご期待に添えるかどうかはわかりませんが、思いつくところを答えさせていただきます。



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/105 …

3.VBScriptを使うとすると
VBScriptだとマッチと変換を繰り返すのでしょうか。そうであるなら正規表現置換一発よりはかなりややこしくなりそうですね。でも全角と半角の変換なので変換後の文字列にはマッチしないこともありそれほど複雑にはならないのではないでしょうか。
全角半角変換もBASP21といったライブラリやVBScriptでの記述例があるようです。

この回答への補足

ご回答ありがとうございます。

とりえあずすぐできそうな(1)をやってみたのですが、、、
すごく実現したいことに近い気がします!!

ただ、分からなかったので、補足欄にて質問です。

>~→文字種の変換で半角にでできます。
これってどうすればできますか??
(その手前までやって、検索ウィンドウ閉じたらヒット文字列が選択されている状態です)

当方Microsoft Office Word 2007です。
何卒よろしくお願いいたします。

補足日時:2012/12/11 17:35
    • good
    • 0

#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
    • good
    • 0
この回答へのお礼

度々ご回答ありがとうございます。

少し手直しされたようですね。
こちらで試させてもらいます。

お礼日時:2012/12/11 15:58

こんにちわ



面白そうだったので、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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

VBAも考えてみたのですが、操作対象のファイル数が多い&内容量も多いのでちょっと諦めてました。
というかめんどくさかったというか・・・
けれどやりようによっちゃあ、ご提示のソースが役に立つかもしれません(^^)

>'■は、変換される文字に絶対現れない文字にする
これだけは・・・難しいですね。
ひらがな、漢字は当然無理ですし、場合によっては■や◆や★が内容に含まれています。。。

いっそ漢字でめっっちゃ難しくて本当に本当に使われないような漢字を探して、
それを使用するのもいいかもしれないですね。
(例えば癮とか麑とか・・・読み方も分かりません。笑)

ちょっと試してみます!(うまくいけば後ほどベストアンサーにするかもです。かも、です。)

お礼日時:2012/12/11 15:09

パターンの一部をそのまま参照するようなものは多いのですが、大文字小文字/全角半角といった変換や計算までできるのは、ほとんどありません。



Perlはその「計算結果で置換できる」側の言語な上に、その気になれば1行でできるくらいなのですが、Windows標準には入っていないので、環境作りが面倒かもしれません
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

VBScriptだとごちゃごちゃになってしまうので、私もPerlを考えました。
しかし開発環境・使用環境を考えて二の足を踏んでます。

>その気になれば1行でできるくらいなのですが
そうですか。驚きです。あまりPerlに詳しくないもので^^;

暇を見つけて、自宅でPerlの検証をしてみようかと思います。

お礼日時:2012/12/10 22:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています