- ベストアンサー
正規表現-数字
VB6で開発しています。 ひとつのテキストボックスがあり(MAXLENGTHが4)、 半角数字or小数点しか入力できないように制御しています。 下記正規表現確認関数で、 00.0~99.9の値のみ認証したいのですが、 (チェック前に Format( XX , '00.0')に変換してます) ○ 3 ○ 3.3 ○ 33 ○ 33.3 × 3.33 × .333 × 333 △ 3.00 → 3.0に変換させる パターンマッチング (\d{1,2}.\d|\d{1,2})ですと 本来×の333がOKとなってしまいます。 正規表現が間違っているのでしょうか? アドバイスお願いします。 関数はこちら Public Function RegExpCheck(ByVal ChkString As String, _ ByVal RegPattern As String) As Boolean '(一部省略) '引数:ChkString 正規表現確認対象文字 ' RegPattern パターン '戻り値:True マッチしている ' :False マッチしていない、あるいは文字・パターンが空白 '(一部省略) Dim reg As New RegExp RegExpCheck = False On Error GoTo RegErr '引数空白チェック・・・空白の場合はFalseを返す '対象文字列 If Trim$(ChkString) = vbNullString Then Exit Function End If 'パターン If Trim$(RegPattern) = vbNullString Then Exit Function End If reg.Pattern = RegPattern If reg.Test(CStr(ChkString)) = True Then RegExpCheck = True End If Exit Function RegErr:
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Option Explicit Public Function RegExpCheck(ByVal ChkString As String, _ ByVal RegPattern As String) As Boolean '(一部省略) '引数:ChkString 正規表現確認対象文字 ' RegPattern パターン '戻り値:True マッチしている ' :False マッチしていない、あるいは文字・パターンが空白 '(一部省略) Dim reg As Object Set reg = CreateObject("vbscript.regexp") RegExpCheck = False On Error GoTo RegErr '引数空白チェック・・・空白の場合はFalseを返す '対象文字列 If Trim$(ChkString) = vbNullString Then RegExpCheck = False Exit Function End If 'パターン If Trim$(RegPattern) = vbNullString Then RegExpCheck = False Exit Function End If reg.Pattern = RegPattern If reg.Test(CStr(ChkString)) = True Then RegExpCheck = True Else RegExpCheck = False End If RegErr: End Function Sub hoge() MsgBox (RegExpCheck("33.3", "^\d{1,2}\.\d$|^\d{1,2}$")) End Sub 'VBA+VBScriptの助けを借りて検証してみたが正規表現自体が誤り。 '.はメタ文字なのでエスケープしないといけない 'また,\d{1,2}は333の中に含まれるので 'それだけをヒットさせたいときは '行頭と行末ではさむ必要がある
その他の回答 (1)
- tqp
- ベストアンサー率0% (0/3)
正規表現では、.は\n以外の全ての文字にマッチします。 ですので、質問者さんの表現では、3333もOKになると思います。 Format関数を通していて必ず小数点以下が入るのなら、 (\d{1,2}\.\d) で大丈夫だと思うのですが…
お礼
No.2さんの解答で通りました。 tqpさんのアドバイスも参考にさせていただきました。 ありがとうございました。
お礼
ポイントは (1)行頭を^ (2)行末を$ (3).はメタキャラクターなので\をつけてエスケープするということですね。 実際にパターンを変えたらできました。 ありがとうございます。