正则表达式验证rails中的Unique Well Identifier

时间:2012-03-29 05:11:31

标签: regex ruby-on-rails-3

我是一名正念新手,似乎无法想出这个。

以下是指向所需字符串格式的链接:

http://earth.gov.bc.ca/royp-bin/phcgi.exe?PH_QKC=DOCUWI&PH_APP=RMSprodApp&PH_HTML=DOCUWI.htm

例如:

100041506421W500 = 1 + 0 + {01-16} + {01-36} + {001-129} + {01-36} + W + {1-6} +0 + {0-9}

我试过了:

^10[0|2-9]{1}0*([1-9]|1[0-6])0*([1-9]|[12][0-9]|3[0-6])0*([1-9][0-9]|1[0-2][0-9])0*([1-9]|[12][0-9]|3[0-6])W[1-6]0[0-9]$

在正则表达式验证器中,除了1041506421W500和10000000041506421W500验证之外,它还有效。整个字符串只能是16个字符。

我很确定我遗漏了一些关于前导零的明显内容。尝试了NTS格式并遇到了同样的问题。

3 个答案:

答案 0 :(得分:1)

好的我觉得我根据你的规范把它弄清楚了:

1+0+{01-16}+{01-36}+{001-129}+{01-36}+W+{1-6}+0+{0-9}

这里扩展了一些评论:

^
1
0
[0|2-9]                           // match 0 or 2-9 (is this missing from your spec?)
(0[1-9]|1[0-6])                   // match 01-09 or 10-16
(0[1-9]|[12][0-9]|3[0-6])         // match 01-09 or 10-29 or 30-36
(00[1-9]|0[1-9][0-9]|1[0-2][0-9]) // match 001-009 or 010-099 or 100-129
(0[1-9]|[12][0-9]|3[0-6])         // match 01-09 or 10-29 or 30-36
W
[1-6]
0
[0-9]
$

这里全部放在一起:

^10[0|2-9](0[1-9]|1[0-6])(0[1-9]|[12][0-9]|3[0-6])(00[1-9]|0[1-9][0-9]|1[0-2][0-9])(0[1-9]|[12][0-9]|3[0-6])W[1-6]0[0-9]$

答案 1 :(得分:0)

  

例如:

100041506421W500 = 1+0+{01-16}+{01-36}+{001-129}+{01-36}+W+{1-6}+0+{0-9}

这已经错了,因为100041506421W500是1 + 0 + 00

0*([1-9]|[12][0-9]|3[0-6])之类的东西也是错误的,导致允许变量长度并且你有固定长度的部分。

主要问题是regexp本身。您最好只使用substrto_i

答案 2 :(得分:0)

你的意思是明显的问题是量词*。这意味着0或更多。

如果您希望这些零是可选的,请使用?作为量词,表示0或1.表示将0*更改为0?

量词{1}是多余的,你可以删除它。