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
コメント
コメントを投稿