Регулярное выражение для подтверждения уникального идентификатора скважины в рельсах - PullRequest
0 голосов
/ 29 марта 2012

Я новичок в regex и, похоже, не могу понять это.

Вот ссылка на необходимые форматы строк:

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 ]

1 голос
/ 29 марта 2012

Хорошо, я думаю, что я исправил это в соответствии с вашей спецификацией:

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]$
0 голосов
/ 29 марта 2012

Очевидная проблема, которую вы имеете в виду, это квантификатор *. Это означает 0 или больше.

Если вы хотите, чтобы эти нули были необязательными, используйте ? в качестве квантификатора, означает 0 или 1. Значит, измените ваш 0* на 0?.

И квантификатор {1} является излишним, вы можете просто удалить его.

0 голосов
/ 29 марта 2012

Например:

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]), также неверно, так как разрешите переменную длину, и у вас есть части фиксированной длины.

И главная проблема - само регулярное выражение. Вам лучше использовать только substr и to_i.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...