2006/06/21(水)正規表現モジュール

はてブ数 2006/06/21 18:37 プログラミング::HSP3つーさ

サンプルのcomtest8.hspを適当にいじくり回してみた。
HSP3でVBScript.RegExpの正規表現を使うwrapperモジュ。
match のサブ式の部分が面倒くさいので今のところノータッチ。
こんなんあるなら最初から reptext.hsp なんて作らんのに(´ω`)

#module vbsregexp
#define ctype IsKanji(%1) ((((%1)^$20)-$a1&$ff)<=$3b)
#defcfunc uniptrtombptr var sample, int letters, int startByte, local ptr
    ptr = startByte
    repeat letters
        if IsKanji(peek(sample,ptr)) : ptr+2 : else : ptr++
    loop
    return ptr-startByte

#deffunc regexp_replace var buf, str from, str to, int opt, local oRegExp, local strResult
    newcom oRegExp,"VBScript.RegExp"
    comres strResult
    oRegExp("Pattern")=from
    oRegExp("Global")=opt&1;// 常に1でもいいか
    oRegExp("IgnoreCase")=opt&2
    oRegExp("Multiline")=opt&4
    oRegExp->"Replace" buf,to
    buf = strResult
    delcom oRegExp
    return

#deffunc regexp_match var buf, str pattern, int opt, local oRegExp, local oMatches, local oMatch
    newcom oRegExp,"VBScript.RegExp"
    comres oMatches 
    oRegExp("Pattern")=pattern
    oRegExp("Global")=opt&1
    oRegExp("IgnoreCase")=opt&2
    oRegExp("Multiline")=opt&4
    oRegExp->"Execute" buf
    MatchCount = oMatches("Count")
    if MatchCount {
        dim matchPos,MatchCount
        dim matchLen,MatchCount
        repeat MatchCount
            oMatch = oMatches("Item",cnt)
            matchPos.cnt = uniptrtombptr(buf,oMatch("FirstIndex"),0)
            matchLen.cnt = uniptrtombptr(buf,oMatch("Length"),matchPos.cnt)
            delcom oMatch
        loop
    }
    delcom oMatches
    delcom oRegExp

    return MatchCount ;// hit数

#defcfunc regexp_getPos int c
    if c<0 : return -1
    if c>=MatchCount : return -1
    return matchPos.c

#defcfunc regexp_getLen int c
    if c<0 : return 0
    if c>=MatchCount : return 0
    return matchLen.c
#global

mes "---- match sample"

buf = "今日は雨ですが、明日は晴れです。"
from = "日は.*?です"

mes "対象文字列: " + buf
mes "パターン  : " + from

regexp_match buf,from,1|2;// オプションは 1:g 2:i 4:m の論理和 
MatchCount = stat
mes "ヒット数 = "+MatchCount
repeat MatchCount
    mes " マッチ文字列 = " + strmid(buf, regexp_getPos.cnt, regexp_getLen.cnt)
    mes "  位置("+cnt+") = " + regexp_getPos.cnt
    mes "  長さ("+cnt+") = " + regexp_getLen.cnt
loop

mes "\\n---- replace sample"

buf = "今日は晴れですね。"
from = "今日は(.*?)です"
to = "明日も$1だよ" ;// '$' は $$ で表現

mes "対象文字列: " + buf
mes "パターン  : " + from
mes "置換後    : " + to
regexp_Replace buf,from,to,1|2
mes buf