重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

z2z12345678z0z0z87654321z1z1z123456789012z1z1
のような文字列から数字8桁のものだけ(9桁以上は一部の8桁も不要で全部不要)
抽出したいのですが、
どうすればよいでしょうか?
Excel用正規表現検索ダイアログアドインを使用しており、
抽出したいもの以外をスペースに置換すればよいかと思い、
抽出したいもの以外の正規表現をどうしたものか悩んでおります。

質問者からの補足コメント

  • Excelのセルに前記のような文字列が入っている状態です。
    数字8桁だけを別列のセルに書き出せれば、なお良いです。

      補足日時:2020/10/14 10:40
  • 複数抽出したいです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/10/14 13:21

A 回答 (4件)

VBAの正規表現では一発ではできないと思います。


数字じゃないもの、数字が9桁以上連続しているものを一度スペースに置換してから、数字8桁のものだけを抽出するなどしてみては。

Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
regex.Global = True

Dim text As String
text = "z2z12345678z0z0z87654321z1z1z123456789012z1z1"

regex.Pattern = "[^0-9]|[0-9]{9,}"
text = regex.Replace(text, " ")

Dim matches As Object
regex.Pattern = "[0-9]{8}"
Set matches = regex.Execute(text)

For i = 0 To matches.Count - 1
MsgBox matches.Item(i)
Next
    • good
    • 1
この回答へのお礼

ありがとうございます。抽出できました。

お礼日時:2020/10/14 16:14

横からすみません。


No3の方へ
12345678a23456789
の文字列の場合、12345678だけしかマッチしないようです。
今回の場合、No1の方が正解のような気がします。
    • good
    • 1
この回答へのお礼

ありがとうございます。確かにご指摘の件確認できました。

お礼日時:2020/10/14 16:16

こんにちは



「正規表現検索ダイアログアドイン」は存じませんので、どの程度のパターン表現が可能なのか不明ですが、一般的な正規表現が可能とするなら
 /(?:^|\D)(\d{8})(?:\D|$)/g
というパターンで抽出が可能と思います。
(実際のところ書式は知りませんので、若干異なるかも知れませんし、使えない記述が含まれているかも知れません)


一方で、
>Excelのセルに前記のような文字列が入っている状態です。
>数字8桁だけを別列のセルに書き出せれば、なお良いです。
とのことなので、セルに表示するので良ければ、該当文字列を抽出するユーザ定義関数を作成してみました。

使い方は、
 =extrct(対象文字列 [, 序数])
という感じです。
 ・対象文字列: 抽出の元となる文字列(当然、セル指定でも良い)
 ・序数 : 複数ヒットする場合に序数番目の値を返す(デフォルトは1)

例えば、A1セルにご例示のような文字列があるとして、結果を列記したいセルに
 =extrct($A$1, ROW(A1))
を代入して、下方にフィルコピーすると(今回は2つですが…)、各セルに
 12345678
 87654321
と表示されます。(3番目以降は、該当がないので空白が返されます)


事前に、以下のユーザ定義関数を、VBAの標準モジュールにコピペしておく必要があります。

Function extrct(ByRef s As String, Optional ByRef n As Long = 1) As String
Dim reg As Object, match As Object
 extrct = ""
 If n < 1 Then Exit Function

 Set reg = CreateObject("VBScript.RegExp")
 reg.Pattern = "(^|\D)(\d{8})(\D|$)"
 reg.Global = True
 Set match = reg.Execute(s)
 If n <= match.Count Then extrct = match(n - 1).SubMatches(1)
End Function
    • good
    • 2
この回答へのお礼

ありがとうございます。参考になりました。

お礼日時:2020/10/14 16:16

数字8桁の箇所が複数あった場合どうするのでしょうか?

この回答への補足あり
    • good
    • 1

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