HSPにおける正規表現の利用

1.概要

正規表現(せいきひょうげん、regular expression)とは、文字列の検索・置換 を行なうときに 利用される文字列の集合を一つの文字列で表現する方法の一つであると定義されています。 通常の文字と、 メタキャラクタと呼ばれる特別な意味を持った記号を組み合わせて正規表現パターンとして 記号化して表現 するものです。著名なテキストエディタでは、検索・置換の機能の中で、正規表現が利用できるように なっています。また、多くのプログラム言語からも利用可能です。Perl、PHP、JavaScript、 VBScript、Ruby等で 機能が内蔵されています。 しかし、いざプログラム上での利用やテキストエディタから正規表現を利用しょうと思っても、 言語やエディタに 搭載されているエンジンの違いにより、基本的な記号の組み合わせは同じでも言語間での 表記方法や特有の機能 により、素人には記号の組み合わせは難解で覚えられません。 覚えられないと言うより、 むしろ、意図した通りの動作をするパターンを作る事の難しい点が挙げられます。

2.正規表現のパターンサンプル

ここでは、複雑なテキストなどの検索や置換を目的とはしておらず、正規表現をHSPからほんの少し便利に 使えたら と考え、正規表現パターンのサンプル集を作成して見ました。パターンの検証は、COM操作関連命令の 利用による VBScriptRegExpを利用することにしました。 尚、正規表現用の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から使えそうな正規表現パターンサンプル
                                                                                                                         
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.ソースコード

VBScriptRegExpによる正規表現の検証用スクリプトです。利用方法としては、
(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

コメント

このブログの人気の投稿

Excelアドインで日本語形態素解析

階層構造JSONファイルの作成

HSPでコマンドプロンプトを制御する

TOP