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

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

ただいまの
回答率

88.61%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,539

yksg

score 11

 前提・実現したいこと

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

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

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

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

 該当のソースコード

Private Function 丁目番を正規表現で拾って置き換え(ByVal 文字列 As String) As String

Dim re_choume As New RegExp
Dim mc_choume As MatchCollection
Dim m As Match
Dim i As Long
Dim tex As String
Dim returntex As String

tex = 文字列

re_choume.Pattern = "[一二三四五六七八九十〇]+(丁目)"
re_choume.Global = True
Set mc_choume = re_choume.Execute(tex)

For Each m In mc_choume
    For i = 0 To m.SubMatches.Count - 1
        MsgBox m.SubMatches(i)'ここでは「丁目」だけが表示される
    Next
Next m

returntex = re_choume.Replace(tex, "-")
丁目番を正規表現で拾って置き換え = returntex


End Function


'テスト用コード↓
Sub tesuto()
Dim aa As String
Dim bb As Variant

aa = "ほげ町三丁目2018"
bb = 丁目番を正規表現で拾って置き換え(aa)

Debug.Print bb

End Sub

''結果↓
'ほげ町-2018

 試したこと

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • think49

    2018/09/10 23:48

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

    キャンセル

  • yksg

    2018/09/11 23:13

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

    キャンセル

回答 2

checkベストアンサー

+2

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/11 23:28

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

    キャンセル

+2

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

re_choume.Pattern = "([一二三四五六七八九十〇]+)丁目"
re_choume.Global = True

returntex = re_choume.Replace(tex, "$1-")
丁目番を正規表現で拾って置き換え = returntex

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/11 23:28

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

    キャンセル

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

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る