<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>正規表現</title>
	<atom:link href="https://javeo.jp/tag/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE/feed/" rel="self" type="application/rss+xml" />
	<link>https://javeo.jp</link>
	<description>ほどほどレベルのプログラミング</description>
	<lastBuildDate>Fri, 27 Sep 2024 18:32:57 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://javeo.jp/wp-content/uploads/2025/08/cropped-ExcelPython_future-32x32.jpg</url>
	<title>正規表現</title>
	<link>https://javeo.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【VBA】 拒否反応が出る正規表現に向き合う</title>
		<link>https://javeo.jp/regexp-beginner/</link>
					<comments>https://javeo.jp/regexp-beginner/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Tue, 16 Aug 2022 23:00:00 +0000</pubDate>
				<category><![CDATA[VBA・Excel]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[正規表現]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=823</guid>

					<description><![CDATA[いきなりですが、正規表現って暗号にしか見えず拒否反応が出るのって私だけですか？ VBAで部分一致してるかとかならLike演算子使えばいいし、文字を抜き出すならLeft、Right、MidにInstr、InstrRevとか [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>このページのサンプルはVBAでの正規表現です</p>



<p>他の言語では若干の違いがあるので流用できない場合があります</p>
</div>



<p>いきなりですが、正規表現って暗号にしか見えず拒否反応が出るのって私だけですか？</p>



<p>VBAで部分一致してるかとかならLike演算子使えばいいし、文字を抜き出すならLeft、Right、MidにInstr、InstrRevとかを組み合わせれば大抵のパターンは対応できるので目を背け続けてきましたが、先日どうしても正規表現を使わざるを得ないことになって最低限使える程度には覚えたので書き出します</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">そもそも正規表現とは</a></li><li><a href="#toc2" tabindex="0">基本的な正規表現</a><ol><li><a href="#toc3" tabindex="0">補足</a></li></ol></li><li><a href="#toc4" tabindex="0">定義済みの正規表現</a></li><li><a href="#toc5" tabindex="0">VBAでの正規表現</a><ol><li><a href="#toc6" tabindex="0">まずは参照設定</a></li><li><a href="#toc7" tabindex="0">RegExpオブジェクトのプロパティとメソッド</a></li><li><a href="#toc8" tabindex="0">MatchCollectionのプロパティとメソッド</a></li><li><a href="#toc9" tabindex="0">Matchのプロパティ</a></li><li><a href="#toc10" tabindex="0">サンプルプログラム</a></li></ol></li><li><a href="#toc11" tabindex="0">Excelでのテスト実行結果</a></li><li><a href="#toc12" tabindex="0">よくある正規表現</a></li><li><a href="#toc13" tabindex="0">あとがき</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">そもそも正規表現とは</span></h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>正規表現は、文字列の集合を一つの文字列で表現する方法の一つである。</p>



<p>もともと正規表現は形式言語理論において正規言語を表すための手段として導入された。</p>



<p>その後正規表現は単機能の文字列探索ツールやテキストエディタ、ワードプロセッサなどのアプリケーションで、マッチさせるべき対象を表すために使用されるようになり、表せるパターンの種類を増やすために本来の正規表現にはないさまざまな記法が新たに付け加えられた。このような拡張された正規表現には正規言語ではない文字列も表せるものも多く、ゆえに正規表現という名前は実態に即していない面もあるが、伝統的に正規表現と呼ばれ続けている。</p>
<cite>https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE</cite></blockquote>



<p>平たく言えばパターンマッチングってやつですね</p>



<p>このパターンの作り方が英字数字だけではなく記号も入り乱れているから暗号のような印象を受けるわけで、一見しても意味が分からないから拒絶反応が出るわけです</p>



<h2 class="wp-block-heading"><span id="toc2">基本的な正規表現</span></h2>



<p>まず基本的な正規表現の文字（メタ文字）から</p>



<figure class="wp-block-table"><div class="scrollable-table"><table><thead><tr><th>文字</th><th>説明</th></tr></thead><tbody><tr><td>.</td><td>任意の1文字（改行除く）</td></tr><tr><td>*</td><td>直前のパターンの0回以上の繰り返し※最長一致</td></tr><tr><td>+</td><td>直前のパターンの1回以上の繰り返し※最長一致</td></tr><tr><td>?</td><td>直前のパターンが0回または1回現れる※最長一致</td></tr><tr><td>*?</td><td>直前のパターンの0回以上の繰り返し※最短一致</td></tr><tr><td>+?</td><td>直前のパターンの1回以上の繰り返し※最短一致</td></tr><tr><td>??</td><td>直前のパターンが0回または1回現れる※最短一致</td></tr><tr><td>()</td><td>()内をグループ化する</td></tr><tr><td>|</td><td>いずれかの条件（つまりor）</td></tr><tr><td>[]</td><td>[]内のいずれかの文字にマッチする</td></tr><tr><td>[^]</td><td>[]内のいずれかの文字にマッチしない</td></tr><tr><td>{n}</td><td>直前のパターンのn回繰り返し</td></tr><tr><td>{n,m}</td><td>直前のパターンのn回以上、m以下の繰り返し ※nかmの一方を省略可</td></tr><tr><td>\</td><td>直後のパターンが正規表現ではなくただの文字として扱うようにする（いわゆるエスケープ）</td></tr><tr><td>^</td><td>先頭</td></tr><tr><td>$</td><td>末尾</td></tr></tbody></table></div></figure>



<h3 class="wp-block-heading"><span id="toc3">補足</span></h3>



<p>サンプルに対して実際に正規表現のマッチ結果を補足的に書いてみる</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label"><span class="tab-caption-box-label-text block-box-label-text box-label-text">サンプル</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>abcde0edcba1AAAAA2BBB3あいうえお4\5カキクケコ</p>
</div></div>



<p><span class="marker-under">&#8220;最長一致&#8221;</span>と<span class="marker-under">&#8220;最短一致&#8221;</span>の違いは最後にマッチする文字か最初にマッチする文字かの違い</p>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>正規表現</th><th>説明</th><th>マッチ結果</th></tr></thead><tbody><tr><td>.*c</td><td>最長一致</td><td>abcde0edc</td></tr><tr><td>.*?c</td><td>最短一致</td><td>abc</td></tr></tbody></table></div></figure>



<p><span class="marker-under">&#8220;(|)&#8221;</span>と<span class="marker-under">&#8220;[]&#8221;</span>の違いは単語ベースで検索するか1文字単位で検索するか</p>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>正規表現</th><th>説明</th><th>マッチ結果</th></tr></thead><tbody><tr><td>(bcd|dcb)</td><td>単語で検索できる</td><td>bcd,dcb</td></tr><tr><td>[bcd]</td><td>1文字単位で検索</td><td>b,c,d</td></tr><tr><td>(b|c|d)</td><td>全て1文字なので[bcd]と同じ</td><td>b,c,d</td></tr></tbody></table></div></figure>



<p><span class="marker-under">&#8220;[]&#8221;</span>内は<span class="marker-under">&#8220;-&#8220;</span>で繋ぐことで範囲検索できる</p>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>正規表現</th><th>説明</th><th>マッチ結果</th></tr></thead><tbody><tr><td>[a-z]</td><td>「a～z」の小文字英字</td><td>a,b,c,d,e</td></tr><tr><td>[B-F]</td><td>「B～F」の大文字英字</td><td>B</td></tr><tr><td>[0-9]</td><td>「0～9」の数字</td><td>0,1,2,3,4,5</td></tr><tr><td>[あ-ん]</td><td>「あ～ん」のひらがな</td><td>あ,い,う,え,お</td></tr><tr><td>[^a-zB-F0-9あ-ん]</td><td>上記以外</td><td>A,\,カ,キ,ク,ケ,コ</td></tr><tr><td>A{3}</td><td>Aの3回繰り返し</td><td>AAA</td></tr></tbody></table></div></figure>



<p>エスケープすると例えば<span class="marker-under">&#8220;.&#8221;</span>はドット扱いになるのでメアドとのマッチとかで使える</p>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>正規表現</th><th>説明</th><th>マッチ結果</th></tr></thead><tbody><tr><td>\.*c</td><td>.がドット扱いになっている</td><td>c</td></tr><tr><td>\\</td><td>\をエスケープする時は並べる</td><td>\</td></tr></tbody></table></div></figure>



<p>先頭と末尾を指定する機会はなくもないけど少ない気もする・・・</p>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>正規表現</th><th>説明</th><th>マッチ結果</th></tr></thead><tbody><tr><td>^bcd</td><td>「bcd」はあるが先頭ではない</td><td>（なし）</td></tr><tr><td>bcd$</td><td>「bcd」はあるが末尾ではない</td><td>（なし）</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading"><span id="toc4">定義済みの正規表現</span></h2>



<p>まず最初に「定義済み」って表現であってますか？（にわかです）</p>



<p>この定義済みの正規表現が便利そうな反面、難解になる原因な気がする</p>



<p>同等の正規表現があるものは無理して使う必要もないけど解読する時は知っておく必要があるのでよく使われるものだけ</p>



<p>他にもありますが私は頭の整理がつかなくなるこれだけにしてます</p>



<figure class="wp-block-table"><div class="scrollable-table"><table class="has-fixed-layout"><thead><tr><th>文字</th><th>説明</th><th>同等の正規表現</th></tr></thead><tbody><tr><td>\d</td><td>数字</td><td>[0-9]</td></tr><tr><td>\D</td><td>数字以外</td><td>[^0-9]</td></tr><tr><td>\w</td><td>英字、アンダーバー、数字</td><td>[a-zA-Z_0-9]</td></tr><tr><td>\W</td><td>英字、アンダーバー、数字以外</td><td>[^a-zA-Z_0-9]</td></tr><tr><td>\s</td><td>空白</td><td>[ \t\f\r\n]</td></tr><tr><td>\S</td><td>空白以外</td><td>[^ \t\f\r\n]</td></tr><tr><td>\t</td><td>タブ</td><td>（なし）</td></tr><tr><td>\r</td><td>改行※キャリッジリターン</td><td>（なし）</td></tr><tr><td>\n</td><td>改行※ラインフィード</td><td>（なし）</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading"><span id="toc5">VBAでの正規表現</span></h2>



<h3 class="wp-block-heading"><span id="toc6">まずは参照設定</span></h3>



<p>「Microsoft VBScript Regular Expressions 5.5」にチェックを入れて利用できる状態へ</p>



<figure class="wp-block-image size-full"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2022/08/2022-08-16_14h45_08.png"><img fetchpriority="high" decoding="async" width="455" height="317" src="https://javeo.jp/wp-content/uploads/2022/08/2022-08-16_14h45_08.png" alt="" class="wp-image-843" srcset="https://javeo.jp/wp-content/uploads/2022/08/2022-08-16_14h45_08.png 455w, https://javeo.jp/wp-content/uploads/2022/08/2022-08-16_14h45_08-300x209.png 300w, https://javeo.jp/wp-content/uploads/2022/08/2022-08-16_14h45_08-150x105.png 150w" sizes="(max-width: 455px) 100vw, 455px" /></a></figure>



<p>参照設定ではなくてCreateObjectを使うときは&#8221;VBScript.RegExp&#8221;</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Dim objReg As Object
Set objReg = CreateObject(&quot;VBScript.RegExp&quot;)</code></pre></div>



<h3 class="wp-block-heading"><span id="toc7">RegExpオブジェクトのプロパティとメソッド</span></h3>



<figure class="wp-block-table"><div class="scrollable-table"><table><thead><tr><th>プロパティ</th><th>説明</th></tr></thead><tbody><tr><td>Pattern</td><td>正規表現のパターン</td></tr><tr><td>IgnoreCase</td><td>大文字と小文字の区別しない時はTrue（指定しない場合はFalseが適用）</td></tr><tr><td>Global</td><td>複数回マッチした場合2回目以降も取得するならTrue（指定しない場合はFalseが適用）</td></tr></tbody></table></div></figure>



<figure class="wp-block-table"><div class="scrollable-table"><table><thead><tr><th>メソッド</th><th>説明</th></tr></thead><tbody><tr><td>Test</td><td>マッチング結果をTrue、Falseで返す</td></tr><tr><td>Replace</td><td>マッチング成功した部分を置換する</td></tr><tr><td>Execute</td><td>マッチング結果をMatchCollectionオブジェクトで返す ※基本これを使う</td></tr></tbody></table></div></figure>



<h3 class="wp-block-heading"><span id="toc8">MatchCollectionのプロパティとメソッド</span></h3>



<figure class="wp-block-table"><div class="scrollable-table"><table><thead><tr><th>プロパティ</th><th>説明</th></tr></thead><tbody><tr><td>Count</td><td>マッチした件数を返す ※GlobalがFalseだと1が最大</td></tr></tbody></table></div></figure>



<figure class="wp-block-table"><div class="scrollable-table"><table><thead><tr><th>プロパティ</th><th>説明</th></tr></thead><tbody><tr><td>Item</td><td>指定したIndexのMatchオブジェクトを返す ※Match(Index)と同等</td></tr></tbody></table></div></figure>



<h3 class="wp-block-heading"><span id="toc9">Matchのプロパティ</span></h3>



<figure class="wp-block-table"><div class="scrollable-table"><table><thead><tr><th>プロパティ</th><th>説明</th></tr></thead><tbody><tr><td>FirstIndex</td><td>最初にマッチングした位置を返す ※文字列の先頭は0から</td></tr><tr><td>Length</td><td>マッチした文字列の長さを返す</td></tr><tr><td>Value</td><td>マッチした文字列を返す</td></tr></tbody></table></div></figure>



<p></p>



<h3 class="wp-block-heading"><span id="toc10">サンプルプログラム</span></h3>



<p>私が正規表現を使うときは基本的にこの関数を準備して実行してます</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-vba" data-lang="Visual Basic + VBA"><code>Public Function RegExpFunc(Target As String, strPattern As String, Optional Idx As Long = 0, Optional strDelimiter As String = &quot;&quot;) As String
&#39;Dim objReg As New VBScript_RegExp_55.RegExp             &#39;---参照設定してればこれでもok
&#39;Dim objMatchColl As VBScript_RegExp_55.MatchCollection  &#39;---参照設定してればこれでもok
&#39;Dim objMatch As VBScript_RegExp_55.Match                &#39;---参照設定してればこれでもok
Dim objReg As Object
Dim objMatchColl As Object
Dim objMatch As Object


Set objReg = CreateObject(&quot;VBScript.RegExp&quot;)
With objReg
    .Pattern = strPattern   &#39;---正規表現のパターン
    .IgnoreCase = False     &#39;---大文字小文字の区別をする
    .Global = True          &#39;---複数回マッチした場合は全て取得する
    Set objMatchColl = .Execute(Target)
End With

&#39;---Idxで指定したIndexのデータを取得する
RegExpFunc = vbNullString
If objMatchColl.Count &gt; Idx Then
    If Idx = -1 Then &#39;---idxを-1でしていた時はobjMatchCollの結合モードにする
        For Each objMatch In objMatchColl
            RegExpFunc = RegExpFunc & strDelimiter & objMatch
        Next
        RegExpFunc = Replace(RegExpFunc, strDelimiter, &quot;&quot;, 1, 1) &#39;---先頭に余計なデリミタがあるから一度だけReplaceで削除する
    Else
        RegExpFunc = objMatchColl(Idx)
    End If
End If

Set objMatch = Nothing
Set objReg = Nothing
End Function</code></pre></div>



<h2 class="wp-block-heading"><span id="toc11">Excelでのテスト実行結果</span></h2>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2022/08/2022-08-17_08h43_18.png"><img decoding="async" width="1024" height="495" src="https://javeo.jp/wp-content/uploads/2022/08/2022-08-17_08h43_18-1024x495.png" alt="" class="wp-image-865" srcset="https://javeo.jp/wp-content/uploads/2022/08/2022-08-17_08h43_18-1024x495.png 1024w, https://javeo.jp/wp-content/uploads/2022/08/2022-08-17_08h43_18-300x145.png 300w, https://javeo.jp/wp-content/uploads/2022/08/2022-08-17_08h43_18-150x72.png 150w, https://javeo.jp/wp-content/uploads/2022/08/2022-08-17_08h43_18-768x371.png 768w, https://javeo.jp/wp-content/uploads/2022/08/2022-08-17_08h43_18.png 1178w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>RegExpFuncを自作関数にして引数をヘッダー部の通りにした結果なのでまで参考に</p>



<p>実際のファイルは下記の&#8221;ダウンロード&#8221;ボタンを押下</p>



<div class="wp-block-file aligncenter"><a rel="follow noopener noreferrer" target="_blank" id="wp-block-file--media-0e714f13-3dd8-42f6-897f-72ac30d284db" href="https://javeo.jp/wp-content/uploads/2022/08/正規表現サンプルマクロ.xlsm">正規表現サンプルマクロ.xlsm</a><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2022/08/正規表現サンプルマクロ.xlsm" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-0e714f13-3dd8-42f6-897f-72ac30d284db">ダウンロード</a></div>



<h2 class="wp-block-heading"><span id="toc12">よくある正規表現</span></h2>



<figure class="wp-block-table"><div class="scrollable-table"><table><thead><tr><th>名称</th><th>正規表現</th><th>サンプル</th></tr></thead><tbody><tr><td>郵便番号</td><td>\d{3}-\d{4}</td><td>100-8111</td></tr><tr><td>携帯電話番号</td><td>0[789]0-\d{4}-\d{4}</td><td>070-0123-4567</td></tr><tr><td>固定電話</td><td>0(\d-\d{4}|\d{2}-\d{3}|\d{3}-\d{2}|\d{4}-\d)-\d{4}</td><td>03-3213-1111</td></tr><tr><td>日付</td><td>\d{1,4}(/|-|年)([0-1]\d|\d)(/|-|月)([0-3]\d|\d)日?</td><td>2022年08月17日</td></tr><tr><td>ドメイン</td><td>([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}</td><td>sub.example.co.jp</td></tr></tbody></table></div></figure>



<h2 class="wp-block-heading"><span id="toc13">あとがき</span></h2>



<p>なんとなくは理解したものの、まだまだ奥は深いしここに書いていないメタ文字もあるので本職の人が書いてる正規表現は相変わらず意味が分からんです</p>



<p>正規表現チェッカーサイトも多々あるので必要ならちゃんと調べて覚えようかな</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/regexp-beginner/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
