ver1.1やver1.1aなどver1.1xが混在するテキストからver1.1のみマッチさせるには
どうすればいいでしょうか。vbのregexだと最小マッチに対応していないと聞いたため、
BASP21というコンポーネントを使用しています。下記のソースだとver1.1aもver1.1bも
マッチしてしまいます。
sw = "ver1.1 ver1.1a ver1.1b"
Matches = MatchEx("/ver1.1+?/", sw, 1)
If IsArray(Matches) Then ' 配列のとき、マッチ
Dim v As Variant
For Each v In Matches
Debug.Print v
Next
End If
MatchEx("/ver1.1+?/", sw, 1)
を
MatchEx("/¥bver1¥.1¥b/", sw, 1)
にしたら動くと思います。
¥bがワードごとの境界を表していて、ver1.1という単語のみとマッチするはずです。
. を ¥. としたのは . だけではあらゆる文字とマッチしてしまうためです。
Perlの方で適当に確認したので動かなかったらすいません。
http://www.hi-ho.ne.jp/babaq/faq.html
BASP21.DLL のMatchExメソッド、BREGEXP.DLL のMatchEx 関数で簡単に使えます。
C++ では、BMatch 関数で BREGEXP構造体を次のように使います。
この為、正規表現の [$](ドルマーク) が利用できると思います。
MatchEx("/ver1.1$/", sw, 1)
この様に変更して「最後が […ver.1.1] で終わる」という指定にしてはどうでしょうか?
もしくは文中での表示である場合、
MatchEx("/ver1.1 /", sw, 1)
後続文字が無い(=半角スペース)という判断でいけるかと思います。
$ですと行末マッチなので、今回のケースには使えません。また、かならず半角スペースがくるとも
限らないので、悩んでました。そこで最小マッチとして?を使ったのですが、使い方が悪いのか、
ver1.1のみにマッチしてくれませんでした。ともあれ、無事に解決できましたので、回答ありがとう
ございました。
無事にver1.1のみにマッチしてくれました。ありがとうございました。