重要なお知らせ

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

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

こんばんは。
Excel2013VBAで質問があります。
以下の正規表現で1桁と2桁の両方の数字(9と10)を取得したいのですが、1桁は取得しますが、2桁の時は数字の後ろの1桁しか取得しません。

Dim reg As New RegExp
Dim result As String
reg.Pattern = "(.*)([0-90-9]{1,2})(.*)"
reg.Global = True '文字列全てを抽出
result = reg.Replace("実験9月", "$2")
Debug.Print result
result = reg.Replace("実験10月", "$2")
Debug.Print result

頭と後ろの文字を後で使用したいので上のやり方の方が便利なのですが、この方法では1桁と2桁の混在に柔軟に対応させることは無理なのでしょうか?
やりたいのは、数字を取得し、1を追加して翌月に変えて、最後に全部足して戻す、みたいなことをしたいです。
reg.Replace(my_Experiment, "$1") & result & reg.Replace(my_month, "$3")

変数result をオブジェクトにしてExecuteで取得すれば一応1桁と2桁の取得できるのですが、
Dim result As MatchCollection
Set result = reg.Execute("実験9月")
reg.Pattern = "[0-90-9]{1,2}"

これでは、数字は取得しても、最後に戻すのが難しいです。
実験9月 → 実験10月 に変更する、など。

最初のやり方が無理なら、簡単にできるよい方法があるでしょうか?
申し訳ございませんが、文字数が変化しても変更なしで対応できる正規表現で行うやり方でお願いします。

A 回答 (1件)

正規表現を以下の様に変更してください。



"(.*)([0-90-9]{1,2})(.*)"
 ↓
"(.*?)([0-90-9]{1,2})(.*)"

正規表現の「*」は貪欲マッチといって、対象文字列をできるだけ多くをマッチさせようとする性質があります。
「[0-90-9]{1,2}」は数字1字にもマッチするので、その左の「.*」は「実験1」(数字の最初の1桁)までマッチさせても全体として「(.*)([0-90-9]{1,2})(.*)」のパターンにマッチすることが可能です。

「.*」 → 「実験1」
「[0-90-9]{1,2}」 → 「0」
「.*」 → 「月」


これを避けるためには貪欲な「*」の代わりに抑制マッチである「*?」を使用します。この場合は可能な限り少なくマッチしようとするので数字の最初の1桁は、「[0-90-9]{1,2}」の方にマッチすることになります。

「.*?」 → 「実験」
「[0-90-9]{1,2}」 → 「10」
「.*」 → 「月」
    • good
    • 0
この回答へのお礼

ありがとうございました。
うまくいきました。

お礼日時:2018/09/09 19:56

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