質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

7180閲覧

正規表現を用いた住所内に含まれる漢数字の置換

yksg

総合スコア11

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2018/09/10 14:39

前提・実現したいこと

番地等の区切りについてハイフンや丁目番地表記が混在している住所のテキストデータを、
ハイフン区切りに統一したいと考えております。
正規表現を使えば何とかなりそうということが分かったので調べながらやってみました。
正規表現に触れるのはこれが初めてです。

発生している問題・エラーメッセージ

例えば
"ほげ町三丁目2018"
というテキストを
"ほげ町三-2018"
と置き換えたいと思い、下記のコードを書いてみました。
しかし結果としては「ほげ町-2018」と三丁目が丸ごと消えてしまいました。

途中でmsgboxを出す時には「丁目」だけを拾えているようなので
それをReplaceメソッドで置換に使えばいいのかと思ったのですが、うまくいきません。

該当のソースコード

ExcelVBA

1 2Private Function 丁目番を正規表現で拾って置き換え(ByVal 文字列 As String) As String 3 4Dim re_choume As New RegExp 5Dim mc_choume As MatchCollection 6Dim m As Match 7Dim i As Long 8Dim tex As String 9Dim returntex As String 10 11tex = 文字列 12 13re_choume.Pattern = "[一二三四五六七八九十〇]+(丁目)" 14re_choume.Global = True 15Set mc_choume = re_choume.Execute(tex) 16 17For Each m In mc_choume 18 For i = 0 To m.SubMatches.Count - 1 19 MsgBox m.SubMatches(i)'ここでは「丁目」だけが表示される 20 Next 21Next m 22 23returntex = re_choume.Replace(tex, "-") 24丁目番を正規表現で拾って置き換え = returntex 25 26 27End Function 28 29 30'テスト用コード↓ 31Sub tesuto() 32Dim aa As String 33Dim bb As Variant 34 35aa = "ほげ町三丁目2018" 36bb = 丁目番を正規表現で拾って置き換え(aa) 37 38Debug.Print bb 39 40End Sub 41 42''結果↓ 43'ほげ町-2018 44

試したこと

正規表現の定義?でカッコでくくる位置を変えてみたりしました。
「丁目」を‐に直接置換する方法も考えましたが、
あとあと~番~号みたいな住所の置換もあるだろうことを踏まえて
できれば正規表現でクリアしたく考えております。

根本的に正規表現に関する理解の浅いところであり大変恐縮ですが、
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2018/09/10 14:48

「銀座一丁目駅」が「銀座一駅」に置換されるのはいいのでしょうか。
yksg

2018/09/11 14:13

ご指摘ありがとうございます。対象とするデータに、駅名が入ることはないので大丈夫です。でもそういう問題もあるのですね…
guest

回答2

0

ベストアンサー

補足。
SubMatchesは、正規表現パターンに一致した文字列のうち、括弧で囲ったかたまりごとに一致したものが入ります。

[一二三四五六七八九十〇]+(丁目)

であれば、括弧は1つ、丁目しか囲われていないので、サブマッチは1つ、「丁目」のみ。
ここで、正規表現パターンを2つの括弧に変更して、メッセージボックスに何が出るかを試してみてください。

([一二三四五六七八九十〇]+)(丁目)

前半の番地と、丁目の2つが表示されるはずです。
で、Replace処理の「置換先の文字」に「$1」や「$2」を入れると、それはサブマッチの1番目、2番目の文字に置き換わります。上記の例だと、番地の数字部分が「$1」、丁目が「$2」になります。

otnさんのサンプルコードでは、括弧を番地の部分だけにして「$1」には番地の数字が入るようにし、そこは残したまま残りの部分をハイフンに置換しているのですね。

投稿2018/09/10 17:06

backyard

総合スコア534

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yksg

2018/09/11 14:28

丁寧なご説明いただきありがとうございます。 とても分かりやすく、otnさんの回答と合わせて試したところ少し分かったような気がします。 試行錯誤しながら理解を深めていきたいと思います。 ご回答いただけましたお二方とも大変助かりました。
guest

0

なんか、replaceの機能を理解できてない気がします。

VBA

1re_choume.Pattern = "([一二三四五六七八九十〇]+)丁目" 2re_choume.Global = True 3 4returntex = re_choume.Replace(tex, "$1-") 5丁目番を正規表現で拾って置き換え = returntex

投稿2018/09/10 16:38

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yksg

2018/09/11 14:28

早々にご回答いただきありがとうございます。 正直に申しますとまだ理屈からしっかり理解できていない感じはあるのですが、 ご教示いただいたコードで期待通りの結果を出せました。 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問