- PR -

正規表現による数値検索について

投稿者投稿内容
nak2k
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 86
投稿日時: 2005-10-26 01:14
コード:

^[-+]?[0-9]+¥.?[0-9]*$
ではなく
^[-+]?[0-9]+¥.?[0-9]+$
ですね


1桁の数値が不許可になりますね。
ってなわけで

^[-+]?[0-9]+(¥.[0-9]+)?$

あとは、[0-9] が ¥d でかけたり。

# ¥のとこは半角で

【おまけ】
0先行不許可版。
^[-+]?([1-9][0-9]*)?[0-9](¥.[0-9]+)?$


[ メッセージ編集済み 編集者: nak2k 編集日時 2005-10-26 01:20 ]

[ メッセージ編集済み 編集者: nak2k 編集日時 2005-10-26 01:24 ]
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-10-26 11:00
修正ありがとうございます

^[-+]?([1-9][0-9]*)?[0-9](¥.[0-9]+)?$

これだと
12.50000が許可されますので
さらなるオマケを

12.50000を許可しないなら
^[-+]?([1-9][0-9]*)?[0-9](\.[0-9]*[1-9])?$
ですね



OracleSQLパズル
http://oraclesqlpuzzle.hp.infoseek.co.jp
がらす
ベテラン
会議室デビュー日: 2005/07/14
投稿数: 99
投稿日時: 2005-10-27 09:27
引用:

明智重蔵さんの書き込み (2005-10-26 11:00) より:

12.50000を許可しないなら
^[-+]?([1-9][0-9]*)?[0-9](.[0-9]*[1-9])?$
ですね




これでは "-0" が許可されてしまいますよ

いや、真面目にいい方法が思いつかないもので。「"-0"でなく、かつ^[-+]?([1-9][0-9]*)?[0-9](.[0-9]*[1-9])?$」という記法って正規表現にありましたっけ?本で探した限りでは見つからないのですが…。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-27 10:19
double.TryParse メソッドで、AllowCurrencySymbol、DecimalPoint、
AllowLeadingSign の複合スタイルで行けると思ったのですが、
先行する小数点 (.123 とか -.123) も数値として返しちゃうんですよね。

まあ、TryPaser メソッドの後に、小数点位置を IndexOf で見て 0 の位置でない且つ、
符号の後でないことを確認すれば OK なんでしょうが、ベタ解析ですね。(;_ _)

コード:

    public static bool IsNumeric(string target) {
        double dNullable;

        if (! double.TryParse(
            target,
            System.Globalization.NumberStyles.AllowCurrencySymbol |
            System.Globalization.NumberStyles.AllowDecimalPoint |
            System.Globalization.NumberStyles.AllowLeadingSign,
            null,
            out dNullable
        )) {
            return false;
        }

        int iDecimalPoint = target.IndexOf('.');

        if (iDecimalPoint == 0) {
            return false;
        }

        if ((iDecimalPoint == 1) && (target[0] == '+' || target[0] == '-')) {
            return false;
        }

        if (target[target.Length - 1] == '.') {
            return false;
        }

        return true;
    }



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-10-27 11:33
引用:

がらすさんの書き込み (2005-10-27 09:27) より:

これでは "-0" が許可されてしまいますよ

いや、真面目にいい方法が思いつかないもので。「"-0"でなく、かつ^[-+]?([1-9][0-9]*)?[0-9](.[0-9]*[1-9])?$」という記法って正規表現にありましたっけ?本で探した限りでは見つからないのですが…。



否定先読みがありますよ

-0と+0を許可しないバージョン

コード:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim aaaa(26) As String

aaaa(1 ) = "123456"
aaaa(2 ) = "1234.56"
aaaa(3 ) = "-123.45"
aaaa(4 ) = "+123.45"
aaaa(5 ) = "-0.123"
aaaa(6 ) = "0"
aaaa(7 ) = "+5"
aaaa(8 ) = "+9"
aaaa(9 ) = "-9"
'↑数値

'↓数値じゃない
aaaa(10) = "+00000000"
aaaa(11) = "-00000000"
aaaa(12) = "+0"
aaaa(13) = "-0"
aaaa(14) = "ABCDEF"
aaaa(15) = "1+23"
aaaa(16) = "123-"
aaaa(17) = "-.123"
aaaa(18) = "123.00000"
aaaa(19) = "123."
aaaa(20) = "00012"
aaaa(21) = ".123"
aaaa(22) = "+0000"
aaaa(23) = "-0000"
aaaa(24) = "+0000.22"
aaaa(25) = "+"
aaaa(26) = "-"

Dim マッチパターン As String = "^(?![-+]0+$)[-+]?([1-9][0-9]*)?[0-9](\.[0-9]*[1-9])?$"
Dim willOutput As String

For i As Integer = 1 To 26
willOutput &= aaaa(i) & "は" & IIf(System.Text.RegularExpressions.Regex.IsMatch(aaaa(i), マッチパターン), "数値", "数値じゃない")
willOutput &= vbCrLf
Next i

MsgBox(willOutput)

Me.Close()
End Sub




OracleSQLパズル
http://oraclesqlpuzzle.hp.infoseek.co.jp

[ メッセージ編集済み 編集者: 明智重蔵 編集日時 2005-10-27 13:05 ]
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2005-10-28 23:07
こんばんは。

正規表現が徐々に育てられていく様を楽しく拝見させて頂いてました。
明智重蔵さんの案でファイナルアンサーでしょうか?
素晴らしいですね。メモメモ。

と、感想だけでは何なので、一点だけつっこみを。
引用:

nak2kさんの書き込み (2005-10-26 01:14) より:
あとは、[0-9] が ¥d でかけたり。

# ¥のとこは半角で


.NETでの正規表現では[0-9]と¥dは、イコールではありません。
.NET Frameworkのリファレンスによると、¥dは『Unicodeの¥p{Nd} と同じ』とのことで、例えば全角の0などもマッチします。
# 私はこれで障害票をもらったことがあります

以上、ご参考まで。
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-11-01 10:45
http://www.oreilly.co.jp/books/4873111307/
そういえば、私の愛読書であるフクロウ本に、\dと[0-9]は一致するとは、限らないとか書いてありましたね

正規表現の処理系によって一致したり、しなかったりだったような

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