HSPにおける正規表現の利用
1.概要
正規表現(せいきひょうげん、regular expression)とは、文字列の検索・置換 を行なうときに
利用される文字列の集合を一つの文字列で表現する方法の一つであると定義されています。 通常の文字と、
メタキャラクタと呼ばれる特別な意味を持った記号を組み合わせて正規表現パターンとして 記号化して表現
するものです。著名なテキストエディタでは、検索・置換の機能の中で、正規表現が利用できるように
なっています。また、多くのプログラム言語からも利用可能です。Perl、PHP、JavaScript、 VBScript、Ruby等で
機能が内蔵されています。
しかし、いざプログラム上での利用やテキストエディタから正規表現を利用しょうと思っても、
言語やエディタに 搭載されているエンジンの違いにより、基本的な記号の組み合わせは同じでも言語間での
表記方法や特有の機能 により、素人には記号の組み合わせは難解で覚えられません。 覚えられないと言うより、
むしろ、意図した通りの動作をするパターンを作る事の難しい点が挙げられます。
2.正規表現のパターンサンプル ここでは、複雑なテキストなどの検索や置換を目的とはしておらず、正規表現をHSPからほんの少し便利に 使えたら と考え、正規表現パターンのサンプル集を作成して見ました。パターンの検証は、COM操作関連命令の 利用による VBScriptのRegExpを利用することにしました。 尚、正規表現用のdllとしては、BREGEXP.dllやjre32.dllをHSPのAPI呼び出しを利用してモジュール化した ものもネットを検索すると公開されていますが、それらの dllを利用したものには、ここで公開している ターンは正常 に動作致しませんので利用に際しては、注意が必要です。
¥dや¥sと言った特殊文字(メタキャラクタ)の場合、'¥'を認識させるためには、¥d → ¥¥d や ¥s → ¥¥s と 記述します。また、 ダブルクォートをパターンの中に含めて記述する場合も、前後に ¥ が必要となりますので 注意して下さい。 各種パターンを組み合わせて、いろいろ検証して見ましたが、何故か、行頭の ^ や行末の $ がうまく認識して くれないため、正規表現パターン例も限定された範囲のものとなっています。 たとえば、パターンの "^[0-9]{1,4}" や "[0-9]{1,4}$" は識別するようですが、 "^[0-9]{1,4}$" は、 うまく識別してくれません。HSPから使えそうな正規表現パターンサンプル
3.ソースコード VBScriptのRegExpによる正規表現の検証用スクリプトです。利用方法としては、
(1)下記のスクリプトの『クリップボード』をクリックして、スクリプトをコピーしてスクリプト
エディタに貼り付ける。
(2)任意の名前を付けて保存する。保存後、スクリプトを実行する。
(3)File欄の参照ボタンをクリックして、任意のhtmやtextファイルを選択する。
(4)検索文字列欄にパターンを入力する。(上記の表の下段のパターンをコピーして入力ボックスに
貼り付ける。)
(5)検索ボタンをクリックする。
(6)検索結果(指定したパターン通りの結果が得られたかどうか)が表示される。
(7)置換の場合は、検索パターンを入力した後、置換文字列欄に置換文字列(パターン)を入力する。
(8)置換ボタンをクリックする。(置換文字列欄を空白にすると、削除する動作となる)
2.正規表現のパターンサンプル ここでは、複雑なテキストなどの検索や置換を目的とはしておらず、正規表現をHSPからほんの少し便利に 使えたら と考え、正規表現パターンのサンプル集を作成して見ました。パターンの検証は、COM操作関連命令の 利用による VBScriptのRegExpを利用することにしました。 尚、正規表現用のdllとしては、BREGEXP.dllやjre32.dllをHSPのAPI呼び出しを利用してモジュール化した ものもネットを検索すると公開されていますが、それらの dllを利用したものには、ここで公開している ターンは正常 に動作致しませんので利用に際しては、注意が必要です。
¥dや¥sと言った特殊文字(メタキャラクタ)の場合、'¥'を認識させるためには、¥d → ¥¥d や ¥s → ¥¥s と 記述します。また、 ダブルクォートをパターンの中に含めて記述する場合も、前後に ¥ が必要となりますので 注意して下さい。 各種パターンを組み合わせて、いろいろ検証して見ましたが、何故か、行頭の ^ や行末の $ がうまく認識して くれないため、正規表現パターン例も限定された範囲のものとなっています。 たとえば、パターンの "^[0-9]{1,4}" や "[0-9]{1,4}$" は識別するようですが、 "^[0-9]{1,4}$" は、 うまく識別してくれません。
| No. | 正規表現パターン例 | 機 能 |
| 0 |
上段:パターンを直接文字列変数に指定する場合
下段:パターンをinput等に入力して指定する場合 |
※指定方法が異なりますので注意して下さい。 |
| 1 |
¥¥d+/¥¥d+/¥¥d+
¥d+/¥d+/¥d+ |
西暦日付(桁数無視、'/' 区切) |
| 2 |
¥¥d+-¥¥d+-¥¥d+
¥d+-¥d+-¥d+ |
西暦日付(桁数無視、'-' 区切) |
| 3 |
¥¥d+/ ¥¥d+/ ¥¥d+| ¥¥d+- ¥¥d+- ¥¥d+
¥d+/¥d+/¥d+|¥d+-¥d+-¥d+ |
西暦日付(桁数無視、'/''-'区切パターン) |
| 4 |
¥¥d{4}/¥¥d{1,2}/¥¥d{1,2}
¥d{4}/¥d{1,2}/¥d{1,2} |
西暦日付(桁数指定、'/' 区切) |
| 5 |
¥¥d{4}-¥¥d{1,2}-¥¥d{1,2}
¥d{4}-¥d{1,2}-¥d{1,2} |
西暦日付(桁数指定、'-' 区切) |
| 6 |
¥¥d{4}/¥¥d{1,2}/¥¥d{1,2}|¥¥d{4}-¥¥d{1,2}-¥¥d{1,2}
¥d{4}/¥d{1,2}/¥d{1,2}|¥d{4}-¥d{1,2}-¥d{1,2} |
西暦日付(桁数指定、'/''-'区切パターン)
19xx年と20xx年の西暦日付の場合 ex(例):(19¥¥d{2}|20¥¥d{2})/¥¥d{1,2}/¥¥d{1,2} |
| 7 |
¥¥d{2,4}-¥¥d{2,4}-¥¥d{4}
¥d{2,4}-¥d{2,4}-¥d{4} |
電話番号を検索
特定の地域の局番とする場合 (例:東京) 03-¥¥d{2,4}-¥¥d{4} |
| 8 |
(090|080|070)-¥¥d{4}-¥¥d{4}
(090|080|070)-¥d{4}-¥d{4} |
携帯電話を検索 |
| 9 |
0120-¥¥d+-¥¥d+
0120-¥d+-¥d+ |
フリーダイヤルを検索 |
| 10 |
¥¥d{3}-¥¥d{4}
¥d{3}-¥d{4} |
郵便番号を検索 |
| 11 |
[¥¥w¥¥d_-]+@[¥¥w¥¥d_-]+¥.[¥¥w¥¥d._-]+
[¥w¥d_-]+@[¥w¥d_-]+.[¥w¥d._-]+ |
メールアドレスを検索 |
| 12 |
http://[¥¥w¥¥d/%#$&?()~_.=+-]+
http://[¥w¥d/%#$&?()~_.=+-]+ |
URL(http)を検索 |
| 13 |
https://[¥¥w¥¥d/%#$&?()~_.=+-]+
https://[¥w¥d/%#$&?()~_.=+-]+ |
URL(https)を検索 |
| 14 |
file://[¥¥w¥¥d/%#$&?()~_.=+-]+
file://[¥w¥d/%#$&?()~_.=+-]+ |
URL(file)を検索 |
| 15 |
(http|https|file|ftp)://[¥¥w¥¥d/%#$&?()~_.=+-]+
(http|https|file|ftp)://[¥w¥d/%#$&?()~_.=+-]+ |
URL(全てのパターン)を検索 |
| 16 | [^/+$]+ | '/'区切りのURLを分解 |
| 17 | <.*?> | HTMLのタグを検索 (全て) |
| 18 | <[^<>]+?> | HTMLのタグを検索 (全て:中に<>が有っても可) |
| 19 |
<(¥"[^¥"]*¥"|'[^']*'|[^'¥">])*>
<("[^"]*"|'[^']*'|[^'">])*> |
HTMLのタグを検索 (<>で囲まれた文字)
シングルラインのみに対応 (途中に改行があるとダメ) |
| 20 | <table.*?> | HTMLのタグを検索 (TABLEタグ) |
| 21 | <a.*?> | HTMLのタグを検索 (Aタグ) |
| 22 | <a href=[^>].+?</a> | HTMLのタグを検索 (Aタグ) <ahref=~ >XXXXXX</a>まで |
| 23 | <img.*?> | HTMLのタグを検索 (IMGタグ) |
| 24 | <meta.*?> | HTMLのタグを検索 (METAタグ) |
| 25 |
<(h[1-6])¥¥b[^>]*>(.*?)</¥¥1>
<(h[1-6])¥b[^>]*>(.*?)</¥1> |
HTMLのタグを検索 (Hタグ) |
| 26 |
<(h[1-6])¥¥b[^>]*>(.*?)</¥¥1>
<(h[1-6])¥b[^>]*>(.*?)</¥1> |
HTMLのタグを検索 (Hタグ) |
| 27 |
(¥<|<)!--¥¥s*.*?¥¥s*--(\>|>)
(<|<)!--¥s*.*?¥s*--(>|>) | コメント文字を検索 (Jscript,xmlのコメント) |
| 28 | <(no)?script.*?script>> | <scrit>~</script>、<noscript>~</noscript> |
| 29 |
(¥<|<)/*¥¥?*(?!¥¥!)|/*¥¥?*(¥>|>)
(<|<)/*¥?*(?!¥!)|/*¥?*(>|>) |
xmlのタグ検索 |
| 30 |
[¥¥0x20]+
[¥0x20]+ |
半角スペースの検索 |
| 31 | [ ]+ | 全角スペースの検索 (全角のスペースを直接指定) |
| 32 | [a-z]+ | 半角小文字アルファベットの検索 (a-z) |
| 33 | [A-Z]+ | 半角大文字アルファベットの検索 (A-Z) |
| 34 | [a-zA-Z]+ | 半角アルファベットの検索 (a-zA-Z) |
| 35 | >[0-9]+ | 半角数字の検索 (0-9) |
| 36 | [0-9a-zA-Z]+ | 半角数字・アルファベットの検索 (a-zA-Z0-9) |
| 37 | [a-z]+ | 全角小文字アルファベットの検索 (a-z) |
| 38 | [A-Z]+ | 全角大文字アルファベットの検索 (A-Z) |
| 39 | [A-Za-z]+ | 全角アルファベットの検索 (A-Za-z) |
| 40 | [0-9]+ | 全角数字の検索 (0-9) |
| 41 | [一-九1-9]+ | 全角数字の検索 (一-九1-9) |
| 42 | [0-9A-Za-z]+ | 全角数字・アルファベットの検索 (0-9A-Za-z) |
| 43 | [ぁ-ん]+ | 全角ひらがなの検索 (ぁ-ん) |
| 44 | [ぁ-ん゛゜ゝゞ]+ | 全角ひらがな(拡張)の検索 (ぁ-ん゛゜ゝゞ) |
| 45 | [ァ-ヶ]+ | 全角カタカナの検索 (ァ-ヶ) |
| 46 | [ァ-ヶ・ーヽヾ]+ | 全角カタカナ(拡張)の検索 (ァ-ヶ・ーヽヾ) |
| 47 |
[^¥¥u0001-¥¥u007E¥¥u00A1-¥¥u00DF¥¥uFF61-¥¥uFF9F]+
[^¥u0001-¥u007E¥u00A1-¥u00DF¥uFF61-¥uFF9F]+ |
全角文字を検索 (半角カナを含まず) |
| 48 |
[^¥¥u0001-¥¥u007E¥¥u00A1-¥¥u00DF]+
[^¥u0001-¥u007E¥u00A1-¥u00DF]+ |
全角文字を検索 (半角カナを含む) |
| 49 |
[¥¥u0020-¥¥u007E¥¥00A1-¥¥u00DF]+
[¥u0020-¥u007E¥00A1-¥u00DF]+ |
半角文字を検索 (半角カナを含まず) |
| 50 |
[¥¥u0020-¥¥u007E¥¥00A1-¥¥u00DF¥¥uFF61-¥¥uFF9F]+
[¥u0020-¥u007E¥00A1-¥u00DF¥uFF61-¥uFF9F]+ |
半角文字を検索 (半角カナを含む) |
| 51 |
[¥¥uFF61-¥¥uFF9F]+
[¥uFF61-¥uFF9F]+ |
半角カナのみを検索 |
| 52 |
¥¥(.+?¥¥)+
¥(.+?¥)+ |
()で囲まれた文字を検索 |
| 53 |
¥¥[.+?¥¥]+
¥[.+?¥]+ |
[]で囲まれた文字を検索 |
| 54 |
/¥¥*[¥¥s¥¥S]*?¥¥*/
/¥*[¥s¥S]*?¥*/ |
マルチラインコメント'/* ~ */'を検索 |
| 55 | //.*$ | シングルラインコメント'//'を検索 |
| 56 |
¥"(?:¥¥.|(¥¥¥¥¥¥¥")|[^¥¥¥"¥"¥¥n])*¥"
"(?:¥.|(¥¥¥¥")|[^¥¥""¥n])*" |
ダブルクォート "XXXXXXX" で囲まれた文字検索 |
| 57 |
'(?:¥¥.|(¥¥¥¥¥¥')|[^¥¥''¥¥n])*'
'(?:¥.|(¥¥¥¥')|[^¥¥''¥n])*' |
シングルクォート 'XXXXXXX' で囲まれた文字検索 |
| 58 |
{(?!¥¥$)[¥¥s¥¥S]*?}
{(?!¥$)[¥s¥S]*?} |
{ XXXXXXX }で囲まれた文字を検索 |
| 59 |
¥¥(¥¥*[¥¥s¥¥S]*?¥¥*¥¥)
¥(¥*[¥s¥S]*?¥*¥) |
(* XXXXXXX *)で囲まれた文字を検索 |
3.ソースコード VBScriptのRegExpによる正規表現の検証用スクリプトです。利用方法としては、
(1)下記のスクリプトの『クリップボード』をクリックして、スクリプトをコピーしてスクリプト
エディタに貼り付ける。
(2)任意の名前を付けて保存する。保存後、スクリプトを実行する。
(3)File欄の参照ボタンをクリックして、任意のhtmやtextファイルを選択する。
(4)検索文字列欄にパターンを入力する。(上記の表の下段のパターンをコピーして入力ボックスに
貼り付ける。)
(5)検索ボタンをクリックする。
(6)検索結果(指定したパターン通りの結果が得られたかどうか)が表示される。
(7)置換の場合は、検索パターンを入力した後、置換文字列欄に置換文字列(パターン)を入力する。
(8)置換ボタンをクリックする。(置換文字列欄を空白にすると、削除する動作となる)
;***** 簡易版RegExpによる検索・置換モジュール *****
#module
#deffunc RegReplace var prm1, var prm2, var prm3, int prm4
; prm1 : 結果取得用バッファ (文字列型変数)
; prm2 : 検索用パターン
; prm3 : 置換用パターンまたは置換文字列
; prm4 : グローバルマッチ (prm4=1でTrue)
newcom regEx, "VBScript.RegExp"
comres prm1
regEx("Pattern")= prm2
regEx("Global") = prm4
;regEx("IgnoreCase") = 0
regEx->"Replace" prm1, prm3
delcom regEx
return
#deffunc RegSearch var prm1, var prm2, int prm3
; prm1 : 結果取得用バッファ (文字列型変数)
; prm2 : 検索用パターン
; prm3 : グローバルマッチ (prm3=1でTrue)
newcom regEx, "VBScript.RegExp"
regEx("Pattern") = prm2
regEx("Global") = prm3
;regEx("IgnoreCase") = 0
comres result
regEx->"Execute" prm1
sdim prm1
c = result("Count")
if c==0 {
delcom result
delcom regEx
return -1
}
repeat c
oMatch = result("Item", cnt)
;oMatch("FirstIndex")
;oMatch("Length")
prm1 += oMatch("Value")+"¥n"
loop
delcom oMatch
delcom result
delcom regEx
return c
#global
;***** 検証用サンプル *****
screen 0,640,480,0,ginfo_dispx-640>>1,ginfo_dispy-480>>1
title "正規表現パターン検証用サンプル"
onexit *owari
; 起動ディレクトリ取得
sdim Startdir,260
if hspstat&1=0 { Startdir=dir_exe+"¥¥" : chdir dir_exe
} else {
Startdir=dir_cur+"¥¥"
}
chdir Startdir
sdim buf,32000
sdim oFile,260
sdim patstr,128
sdim repstr,128
color 0,0,0
font "Meiryo UI",14 : objmode 2
pos 6,6 : mes "File" : objsize ginfo(10)-150,22
pos 80,2 : input oFile
objsize 56,22
pos ginfo(10)-66,2 : button "参照",*fdialog
pos 6,30 : mes "検索文字列" : objsize ginfo(10)-150,22
pos 80,26 : input patstr
objsize 56,22
pos ginfo(10)-66,26 : button "検索",*search
pos 6,56 : mes "置換文字列" : objsize ginfo(10)-150,22
pos 80,54 : input repstr
objsize 56,22
pos ginfo(10)-66,54 : button "置換",*replace
;**** mesboxを作成 ****
pos 0,140
mesbox buf,ginfo(10)-4,ginfo(11)-164,5 : id=stat
stop
*fdialog
dialog "",16 : if stat=0 : stop
notesel buf : noteload refstr
oFile = refstr
objprm 0,oFile
objprm id,buf
stop
*search
RegSearch buf, patstr, 1
objprm id,buf
color 255,255,255 : boxf 8,80,ginfo(10),120
color 255,0,0
if stat=-1 {
pos 10,100 : mes "検索パターンに一致しません。"
}else{
pos 10,100 : mes "検索パターンに一致しました。 一致件数 = "+stat+"件"
}
color 0,0,0
stop
*replace
color 255,255,255 : boxf 8,80,ginfo(10),120
if patstr="" : dialog "検索文字列が指定されていません。",0 : stop
RegReplace buf, patstr, repstr, 1
objprm id,buf
color 0,0,0
stop
*owari
end

コメント
コメントを投稿