正規表現で質問です。

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

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/02/24 16:17:01
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:YasuyukiMiura No.1

回答回数33ベストアンサー獲得回数7

ポイント60pt

MatchEx("/ver1.1+?/", sw, 1)

MatchEx("/¥bver1¥.1¥b/", sw, 1)


にしたら動くと思います。

¥bがワードごとの境界を表していて、ver1.1という単語のみとマッチするはずです。

. を ¥. としたのは . だけではあらゆる文字とマッチしてしまうためです。


Perlの方で適当に確認したので動かなかったらすいません。

id:kuruma_neko

無事にver1.1のみにマッチしてくれました。ありがとうございました。

2008/02/24 16:15:16
id:arcana No.2

回答回数120ベストアンサー獲得回数10

ポイント10pt

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)

後続文字が無い(=半角スペース)という判断でいけるかと思います。

id:kuruma_neko

$ですと行末マッチなので、今回のケースには使えません。また、かならず半角スペースがくるとも

限らないので、悩んでました。そこで最小マッチとして?を使ったのですが、使い方が悪いのか、

ver1.1のみにマッチしてくれませんでした。ともあれ、無事に解決できましたので、回答ありがとう

ございました。

2008/02/24 16:15:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません