プロが教える店舗&オフィスのセキュリティ対策術

よろしくお願いします。
標題の通りです。

VBAでツール->参照設定からMS RegExpをオンにしています。

後方の一致と不一致は正常に動作しています(パターン1と2)。
ところが、前方に一致/不一致させようとしても、エラーになったり、期待通りの動作になりません。

そもそも、できないのでしょうか?
それとも、書き方が違うのでしょうか?
ネットで調べても該当する情報が見つけられませんでした。
よろしくお願いします。


Sub regextest()

target = "たとえばここにpineappleがあります。"

Set objRE = CreateObject("VBScript.RegExp")
objRE.Pattern = "pine(?!a)" 'パターン1 False、期待動作
'objRE.Pattern = "pine(?=a)" 'パターン2 True、期待動作

'objRE.Pattern = "(?<=に)pine" 'パターン4、test 実行時にエラー
'objRE.Pattern = "(<=に)pine" 'パターン5、False、しかしTrueになってほしい
'objRE.Pattern = "(?<!に)pine" 'パターン6、test 実行時にエラー
'objRE.Pattern = "(<!に)pine" 'パターン7、test 実行時にエラー

objRE.Global = True

res = objRE.test(target)
Debug.Print res
If res = True Then

Set hit = objRE.Execute(target)
For i = 0 To hit.Count - 1
Debug.Print hit(i)
Next i
End If

End Sub

A 回答 (2件)

こんにちは。



気になっていたことなので、本日調べてみました。
VBScript の RegulaExp は、そんなに悪くはないものの、それは、VB系の関数などがあって、その足りない機能を補完できるからだと思います。
技術評論社の『正規表現』という本に、多少まとめてはあるので見てみましたが、ずいぶん少ないなって思います。

キャプチャー/クループの範囲では、
(●●●), \n [=n番目のキャブチャ),●●●|●●●,(?:●●●),(?=●●●),(?!●●●)

ご質問の内容で書かれているのは、Perl系ですが、
VBA/VBScript 系でもう少しバリエーションを持とうとすると、
Basp21 の BRegExp ぐらいです。この発展形 の オニグルマ(onigregexp/bregonig.dll)は、VBAには対応していません。それがあれば、もうちょっと別の使い方ができるわけですが。

http://www.hi-ho.ne.jp/babaq/basp21.html

BregExp/OnigRegExp 系のパターン
http://sakura-editor.sourceforge.net/htmlhelp/HL …

例:
Set bobj = CreateObject("Basp21")
ret = bobj.Replace("s/\w+(?!=apple)/$1/mk", Target)
BregExp は、">" が使えません。便利ではあるけれども、誰しも使っているわけではないのが、ネックかもしれません。また、もう10数年、誰も手付かずのままになっていて、そろそろ新しいものが出てきても良いとは思います。
    • good
    • 0
この回答へのお礼

遅ればせながら。。ありがとうございました!

お礼日時:2019/03/18 10:01

こんにちは



VBAの正規表現は一般的なものに比べて弱い部分があるようで、戻り読みには対応していないのではないかと思います。(きちんと調べたわけではありませんが)
https://msdn.microsoft.com/ja-jp/library/cc39202 …
    • good
    • 0
この回答へのお礼

この表によると、たしかに。。。
しかも(?!pattern)の説明文が間違ってますね。。。(!にすべきところを=にしてる)

ありがとうございました。

お礼日時:2018/05/11 12:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています