0から任意の数までにマッチする正規表現パターンを吐くスクリプト

今日会社で「65535までの数値にマッチする正規表現てどうしたらいい」と訊かれる
何に使うのかと問い返したらテキストボックスの入力値チェックだそうな

それどうしても正規表現じゃないと駄目ですかと問うたら
駄目です
とのこと

…駄目じゃねーですよそれきっとたぶんぜったい

まぁ仕事もしたくなかったし気分転換に取り組んでみたりしてなんとかそれっぽいのが出来た
ただ、もし次にじゃあ*****までだったらどうすんの、とか訊かれないようにスクリプト書いたよ
最近UWSCやってないからUWSCで

num = input("数値を入力")
if ! chknum(num) then exit

dim pattern
l = length(num) – 1
dim n[l]
for i = 0 to l
    n[i] = copy(num, i + 1, 1)
    if n[i] = 0 and i <> l then continue
    ifb i = 0 and l <> 0 then
        p = ""
        ifb n[i] > 1 then
            p = "[1-" + (n[i] – 1) + "]?"
        endif
        p = p + "d{1," + l + "}"
    else
        if length(pattern) then pattern = pattern + "|"
        p = ""
        for j = 0 to i
            ifb j = i then
                ifb i = l then
                    p = p + "[0-" + n[j] + "]"
                else
                    p = p + "[0-" + (n[j] – 1) + "]d{" + (l – i) + "}"
                endif
            else
                p = p + "" +  n[j]
            endif
        next
    endif
    pattern = pattern + "^" + p + "$"
next
pattern = replace(pattern, "[1-1]", "1")
pattern = replace(pattern, "[0-0]", "0")
pattern = replace(pattern, "{1,1}", "")
pattern = replace(pattern, "{1}", "")
pattern = replace(pattern, "[0-9]", "d")

input("0~" + num + "までにヒットする正規表現", pattern)

65535って入れれば^[1-5]?d{1,4}$|^6[0-4]d{3}$|^65[0-4]d{2}$|^655[0-2]d$|^6553[0-5]$を返す
1024って入れれば^d{1,3}$|^10[0-1]d$|^102[0-4]$を返す
一応ちゃんと範囲内の全ての数値にマッチする

出力されたものは一応今思いつく限り一番効率的なパターンなはずなんだけど
もっと効率のいい(短くて済む)ようなのあるのかね
あったらいいね

 

書き終えてみてやっぱり正規表現使わない実装してほしいかなぁ と思うんだけど
だめですか

広告

0から任意の数までにマッチする正規表現パターンを吐くスクリプト」への1件のフィードバック

  1. このコードをリリース後にメンテしていくのはシンドイだろうし、やっぱ普通に実装した方がいいと思う・・・

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中