- PR -

正規表現で数値のみチェック

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-12 09:55
System.Double.TryParse を使う方法で試してみたのですが、

 「"0"〜"9" のみ」、
 「"." や "-" は数値」、
 「"," くらいは大目にみてやってもよい」

など、各シーンによって規則を微妙に変えることもあるので、後から見て、それらの内容が一目でわかるのは、正規表現しかないと思いました。
しかし、それとどのように書いてよいのかがわかりません。

コード:
Private sub テスト()
    MessageBox.Show(CType(数値だ("r1"), String))
    MessageBox.Show(CType(数値だ("-123.908"), String))
    MessageBox.Show(CType(数値だ("a-123.908a"), String))
end sub

Private Function 数値だ(ByVal 文字列 As String) As Boolean
    Dim regex As New System.Text.RegularExpressions.Regex("^[0-9\.\-]*")
    Dim m As System.Text.RegularExpressions.Match = regex.Match(文字列)

    '一致すればtrue
    Return m.Success
End Function



僕のやりたいのは、"0123456789.-" のみの文字列なら True それ以外の文字が含まれていたら False にしたいのです。
しかし、「true」が3回表示されてしまいます。

多分、文字列に一致する文字が含まれていた場合、m.Success が True になるためだと想像はできます。

どうすれば良いのでしょうか?
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-12-12 10:15
>"0123456789.-" のみの文字列なら True
>それ以外の文字が含まれていたら False にしたいのです

^[-.0-9]+$
でいいと思います
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-12 10:28
引用:

R・田中一郎さんの書き込み (2005-12-12 09:55) より:

System.Double.TryParse を使う方法で試してみたのですが、
(snip)
各シーンによって規則を微妙に変えることもあるので、後から見て、それらの内容が一目でわかるのは、正規表現しかないと思いました。


Double.TryParse メソッドをラップしたようなオーバーロードなメソッドを定義して、
独自の列挙体でオプション指定する方法でも十分判りやすいかと思いますよ。
インテリセンスに対応すべく、XML コメントを書いておくと尚良いです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-12 11:20
引用:

明智重蔵さんの書き込み (2005-12-12 10:15) より:

^[-.0-9]+$
でいいと思います



成功しました。
何故成功したのかがよくわかっていないので、これから調べてみます。
ありがとうございました。

引用:

じゃんぬねっとさんの書き込み (2005-12-12 10:28) より:
引用:

R・田中一郎さんの書き込み (2005-12-12 09:55) より:

System.Double.TryParse を使う方法で試してみたのですが、
(snip)
各シーンによって規則を微妙に変えることもあるので、後から見て、それらの内容が一目でわかるのは、正規表現しかないと思いました。


Double.TryParse メソッドをラップしたようなオーバーロードなメソッドを定義して、
独自の列挙体でオプション指定する方法でも十分判りやすいかと思いますよ。
インテリセンスに対応すべく、XML コメントを書いておくと尚良いです。



なるほど、自分なりに定義しちゃえば良かったんですね。
インテリセンスに対応させたことが無いので、これも挑戦してみます。
ありがとうございました。

コード:
'正規表現の場合
if (正規表現による条件一致(文字列, "^[-.0-9]+$") then
    message.show("数値でした")
else
    message.show("数値じゃありませんでした")
end if

'自作した場合(1 は、0-9 と .- を数値とするオプション)
if (数値チェック(文字列, 1)) then
    message.show("数値でした")
else
    message.show("数値じゃありませんでした")
end if

R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-12 11:21
引用:

明智重蔵さんの書き込み (2005-12-12 10:15) より:

^[-.0-9]+$
でいいと思います



成功しました。
何故成功したのかがよくわかっていないので、これから調べてみます。
ありがとうございました。

引用:

じゃんぬねっとさんの書き込み (2005-12-12 10:28) より:
引用:

R・田中一郎さんの書き込み (2005-12-12 09:55) より:

System.Double.TryParse を使う方法で試してみたのですが、
(snip)
各シーンによって規則を微妙に変えることもあるので、後から見て、それらの内容が一目でわかるのは、正規表現しかないと思いました。


Double.TryParse メソッドをラップしたようなオーバーロードなメソッドを定義して、
独自の列挙体でオプション指定する方法でも十分判りやすいかと思いますよ。
インテリセンスに対応すべく、XML コメントを書いておくと尚良いです。



なるほど、自分なりに定義しちゃえば良かったんですね。
インテリセンスに対応させたことが無いので、これも挑戦してみます。
ありがとうございました。

コード:
'正規表現の場合
if (正規表現による条件一致(文字列, "^[-.0-9]+$") then
    message.show("数値でした")
else
    message.show("数値じゃありませんでした")
end if

'自作した場合(1 は、0-9 と .- を数値とするオプション)
if (数値チェック(文字列, 1)) then
    message.show("数値でした")
else
    message.show("数値じゃありませんでした")
end if

たつ64
会議室デビュー日: 2005/08/02
投稿数: 16
お住まい・勤務地: 天下の台所?
投稿日時: 2005-12-12 15:35
理由はアサーション「$」の有無ですね。
#省略時(string.Empty)にOKとするなら量指定子は「*」

因みに「---...222」とかでもOKとなりますが…。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-12 17:28
引用:

たつ64さんの書き込み (2005-12-12 15:35) より:
理由はアサーション「$」の有無ですね。
#省略時(string.Empty)にOKとするなら量指定子は「*」



$ は「最後」という意味ですか?

^ 最初から
$ 最後まで
+ 一つ以上で
[-.0-9] この文字である

と言う解釈になりましたが、果たしてあっているんだろうか・・・

引用:

たつ64さんの書き込み (2005-12-12 15:35) より:
#省略時(string.Empty)にOKとするなら量指定子は「*」


何も無くてもOKなら、

^[-.0-9]*$

になるのかな?

引用:

たつ64さんの書き込み (2005-12-12 15:35) より:
因みに「---...222」とかでもOKとなりますが…。



ああっ、そう言われると、とても気になってしまいます。

^-*[.0-9]+$

こうすればいいのかな?
間違ってますか?

-.9

ちなみに、これは正しい表記ですよね?
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-12 18:17
たくさんの疑問符で申し訳ないです。
自分なりに調べてみたのですが、どうも自信がなくてうろたえてしまいました。
しかし、先ほど、片っ端からテストしてみればよいことに気がつきました。
その上でわからなければ、もう少し具体的に質問させていただきます。

本当に申し訳ありません。

スキルアップ/キャリアアップ(JOB@IT)