reExecute

構文
Matches = reExecute( str, Pattern, [IgnoreCase, Global] )
引数
str
正規表現による検索の対象となる文字列
Pattern
正規表現で使用するパターンを設定
IgnoreCase
大文字・小文字を区別しない場合はTrue、区別する場合はFalse
Global
文字列全体を検索する場合はTrue、しない場合はFalse
戻値
正規表現で検索した結果をMatchesコレクションとして返します。

プログラム

//////////////////////////////////////////////////
// 【引数】
//   str : 正規表現による検索の対象となる文字列 
//   Pattern : 正規表現で使用するパターンを設定 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻値】
//   正規表現で検索した結果をMatchesコレクションとして返します。 
//////////////////////////////////////////////////
FUNCTION reExecute(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Execute(str)
FEND

正規表現のメタ文字

文字クラス

メタ文字 意味
. 任意の一文字
[] 角括弧内のいずれかの文字。「-(ハイフン)」で範囲を指定
[^] 角括弧内のいずれかの文字以外。角括弧内すべての文字が否定されます。
[0-9] 数字。[0123456789]と同じ
[A-Z] アルファベット大文字。[ABCDEFGHIJKLMNOPQRSTUVWXYZ]と同じ
[a-z] アルファベット小文字。[abcdefghijklmnopqrstuvwxyz]と同じ
[0-9A-Za-z] 数字・アルファベット。[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]と同じ
[^0-9] 数字以外
[ぁ-ん] ひらがな
[ァ-ヴ] カタカナ
[ ]内でエスケープが必要な文字
-(ハイフン)
ハイフンは文字コードの範囲を示すために使われます。ハイフンを文字として使う場合、「\-」と記述します。
先頭の^
[^…]で否定の意味になるので、「\^」とエスケープするか、先頭に置かないようにします。
](角括弧の閉じ)
角括弧の閉じは終了を意味するので、「\]」とエスケープします。

繰り返し

メタ文字 意味
* 直前の文字を0回以上繰り返し(最長マッチ)
+ 直前の文字を1回以上繰り返し(最長マッチ)
? 直前の文字が0回または1回(最長マッチ)
{n} 直前の文字がn回繰り返し
{n,} 直前の文字がn回以上繰り返し
{n,m} 直前の文字がn回以上m回以下の繰り返し

大文字は小文字の否定。

メタ文字 意味
\d 数字。[0-9]と同じ。
\D 数字以外。[^\d]
\w 英数字とアンダーバー。[0-9A-Za-z_]
\W 英数字とアンダーバー以外。[^\w]
\s 空白。[\f\n\r\t\v]。
\S 空白以外。[^\s]。

メタ文字 意味
^ 行頭
$ 行末
\b
\B

先読み・後読み

メタ文字 意味
(?=) 肯定先読み
(?!) 否定先読み
(?<=) 肯定後読み
(?) 否定後読み
reExecute(str, "Word(?=Press)")

一致リストの取得

指定した範囲の整数

以下は、0〜255の範囲にある整数にマッチする正規表現です。

DIM Matches = reExecute(str, "\b([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b")
\b([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b
0〜99の数値
\b([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b
100〜199の数値
\b([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b
200〜249の数値
\b([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b
250〜255の数値
\b([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b
0〜99、100〜199、200〜249、または250〜255の数値。

URL

DIM Matches = reExecute(str, "https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?")

メールアドレス

受信したメールの本文から抽出するときなどに。

DIM Matches = reExecute(str, "[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*")

郵便番号

DIM Matches = reExecute(str, "\d{3}-\d{4}")
\d{3}-\d{4}
3桁の数字
\d{3}-\d{4}
4桁の数字

日付(Y/M/D形式)

日付の正規表現です。あくまで月が1~12、日が1~31の範囲であることだけを確認しているので、06/31など存在しない日付にもマッチします。

DIM Matches = reExecute(str, "[0-9]{,4}/(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01])")
[0-9]{,4}/(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01])
4桁以下の数字
[0-9]{,4}/(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01])
1~12の数字。先頭の0埋めはあってもなくても良い。
[0-9]{,4}/(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01])
1~31の数字。先頭の0埋めはあってもなくても良い。

日付(YMD形式)

厳密に日付をチェックするには以下を使います。

DIM Matches = reExecute(str, "(?!([02468][1235679]|[13579][01345789])000229)(([0-9]{4}(01|03|05|07|08|10|12)(0[1-9]|[12][0-9]|3[01]))|([0-9]{4}(04|06|09|11)(0[1-9]|[12][0-9]|30))|([0-9]{4}02(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}([02468][048]|[13579][26])0229))")

携帯電話番号(070、080、090から始まる11桁の番号)

070-0・080-0・090-0から始まる番号は存在しないので除外。

DIM Matches = reExecute(str, "0[789]0-[1-9]\d{3}-\d{4}")

フリーダイヤル(0120-000-000、0800-000-0000)

DIM Matches = reExecute(str, "0(?:120-\d{3}-\d{2}|800-\d{3}-\d{3})0")

IP電話(050から始まる11桁の番号)

DIM Matches = reExecute(str, "050-\d{4}-\d{4}")

IPアドレス

IPアドレスは「xxx.xxx.xxx.xxx」形式で表されます。x=0~255の値。

DIM Matches = reExecute(str, "(([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])")
(([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
0~99の数値
(([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
100~199の数値
(([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
200〜249の数値
(([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
250〜255の数値
(([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
250〜255 or 200〜249 or 100〜199 or 0〜99なので0〜255
(([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
「0〜255.」を3回繰り返し。
(([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
0〜255の数値

英数字

DIM Matches = reExecute(str, "[A-Za-z0-9]+")

一致したリストへのアクセス

FOR n = 0 TO Matches.Count – 1
	PRINT Matches.Item(n).Value
NEXT

MatchesはCOMコレクション(Countプロパティで要素数を取得でき、Itemメソッドまたはプロパティで単一オブジェクトを取得できるもの)なので、FOR-IN-NEXTでもアクセスできます。

FOR Match IN Matches
	PRINT Match.Value
NEXT

プログラム実行例

サービスをすべて取得し、そのサービスをユーザーが開始・停止できるかどうかをブール値で返す

DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM str = DOSCMD("sc query state=all | findstr /B <#DBL>SERVICE_NAME:<#DBL>")
DIM Matches = reExecute(str, "SERVICE_NAME: (.*?)\r\n")
DIM services[Matches.Count]

FOR n = 0 TO Matches.Count - 1
	DIM service = Matches.Item(n).SubMatches(0)
	services[n] = service + ":" + Shell.CanStartStopService(service)
NEXT

QSORT(services, QSRT_UNICODEA)

FOR service IN services
	PRINT service
NEXT

//////////////////////////////////////////////////
// 【引数】
//   str : 正規表現による検索の対象となる文字列 
//   Pattern : 正規表現で使用するパターンを設定 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻値】
//   正規表現で検索した結果をMatchesコレクションとして返します。 
//////////////////////////////////////////////////
FUNCTION reExecute(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Execute(str)
FEND
  1. script.function.CREATEOLEOBJ(1)
  2. script.function.DOSCMD(2)
  3. udf.reExecute(3)
  4. com.Shell.CanStartStopService(9)
  5. script.function.QSORT(11)
結果
AarSvc_4de65:False
AdobeARMservice:False
AJRouter:False
ALG:False
ALUpdateService:False
(中略)
WwanSvc:False
XblAuthManager:False
XblGameSave:False
XboxGipSvc:False
XboxNetApiSvc:False

接続中の無線LAN情報を取得

連想配列に代入した後にすべて出力していますが、必要な項目だけ取得する場合は「LAN["SSID"]」のように指定します。

HASHTBL LAN

DIM str = DOSCMD("netsh wlan show interface")
DIM Matches = reExecute(str, "\s*?((?=\S).*?)\s*? : \s*?(.*?)\s*?\n")

FOR i = 0 TO Matches.Count - 1
	WITH Matches.Item(i)
		LAN[.SubMatches(0)] = .SubMatches(1)
	ENDWITH
NEXT

FOR i = 0 TO LENGTH(LAN) - 1
	PRINT LAN[i, HASH_KEY] + " : " + LAN[i, HASH_VAL]
NEXT

//////////////////////////////////////////////////
// 【引数】
//   str : 正規表現による検索の対象となる文字列 
//   Pattern : 正規表現で使用するパターンを設定 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻値】
//   正規表現で検索した結果をMatchesコレクションとして返します。 
//////////////////////////////////////////////////
FUNCTION reExecute(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Execute(str)
FEND
  1. script.function.DOSCMD(3)
  2. udf.reExecute(4)
  3. script.function.LENGTH(12)
結果
・接続時

名前 : Wi-Fi
説明 : Intel(R) WiFi Link 5100 AGN
GUID : ********-****-****-****-************
物理アドレス : **:**:**:**:**:**
状態 : 接続されました
SSID : ************-**
BSSID : **:**:**:**:**:**
ネットワークの種類 : インフラストラクチャ
無線の種類 : 802.11g
認証 : WPA2-パーソナル
暗号 : CCMP
接続モード : プロファイル
チャネル : 6
受信速度 (Mbps) : 144
送信速度 (Mbps) : 144
シグナル : 99%
プロファイル : ************-**


・未接続時

名前 : Wi-Fi
説明 : Intel(R) WiFi Link 5100 AGN
GUID : ********-****-****-****-************
物理アドレス : **:**:**:**:**:**
状態 : 切断されました
無線の状態 : ハードウェア オン

設定したことのあるWi-Fi のプロファイル名(SSID)を取得

HASHTBL LAN

DIM str = DOSCMD("netsh wlan show profile")
DIM Matches = reExecute(str, "\s*? : (.*?)\n")

DIM array[-1]

FOR i = 0 TO Matches.Count - 1
	arrayPush(array, Matches.Item(i).SubMatches(0))
NEXT

FOR i = 0 TO UBound(array)
	PRINT array[i]
NEXT

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   str : 追加する要素 
// 【戻値】
//   処理後の配列の中の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
	DIM res = RESIZE(arr, UBound(arr) + 1)
	arr[res] = str
	RESULT = res + 1
FEND

//////////////////////////////////////////////////
// 【引数】
//   str : 正規表現による検索の対象となる文字列 
//   Pattern : 正規表現で使用するパターンを設定 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻値】
//   正規表現で検索した結果をMatchesコレクションとして返します。 
//////////////////////////////////////////////////
FUNCTION reExecute(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Execute(str)
FEND

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
FEND
  1. script.function.DOSCMD(3)
  2. udf.reExecute(4)
  3. udf.arrayPush(9)
結果
************-2G
aterm-******-g
Buffalo-G-****
auhome_******
aterm-******-g
FON_FREE_INTERNET

接続したことあるWi-FiのSSIDとパスワードを取得

DIM str = DOSCMD("netsh wlan show networks")
DIM Matches_SSID = reExecute(str, "SSID \d+ : (.*?)\r\n")

FOR n = 0 TO Matches_SSID.Count - 1
	DIM SSID = Matches_SSID.Item(n).SubMatches(0)
	str = DOSCMD("netsh wlan show profiles name=" + SSID + " key=clear")
	PRINT "SSID<#TAB><#TAB>" + SSID
	Matches_Pass = reExecute(str, "主要なコンテンツ       : (.*?)\r\n")
	IFB Matches_Pass.Count <> 0 THEN
		PRINT "パスワード<#TAB>" + Matches_Pass.Item(0).SubMatches(0)
	ELSE
		PRINT "パスワード<#TAB>"
	ENDIF
	PRINT "-----"
NEXT

//////////////////////////////////////////////////
// 【引数】
//   str : 正規表現による検索の対象となる文字列 
//   Pattern : 正規表現で使用するパターンを設定 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻値】
//   正規表現で検索した結果をMatchesコレクションとして返します。 
//////////////////////////////////////////////////
FUNCTION reExecute(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Execute(str)
FEND
  1. script.function.DOSCMD(Ώ,6])
  2. udf.reExecute(ΐ,8])
参考文献
正規表現