Кто-либо мог обеспечить регулярное выражение для числа, которое должно быть между 1 и 17 в длине и могло дополнительно содержать мантиссу до 4 мест? Длина 17 включает и характеристику и мантиссу.
Править:
Длина 17 исключает десятичную точку.
Допустимые примеры:
12345678901234567 1234567890123.4567 123456789012345.67 12.34
Недопустимый:
12345678901234.5678 (Length of numerals = 18)
Спасибо.
^\d{17}$|^\d{13}(?=.{5}$)\d*\.\d*\d$
Regex объяснил:
^\d{17}$ //A string of 17 digits
| //or
^\d{13} //13 digits followed by
(?=.{5}$) //5 characters, of which
\d*\.\d* //one is a decimal point and others are digits
\d$ //and the last one is a digit
Хорошо, это лучшее, что я мог сделать:
/^\d{1,17}$|(?=^.{1,18}$)^\d+\.\d{1,4}$/
В основном, сопоставление 1–17 цифр или строк длиной 1–18, которые состоят из двух наборов цифр, разделенных точкой. Правильный набор может содержать только от 1 до 4 цифр.
Не делайте это полностью в регулярном выражении. Проблема становится почти тривиальной для большинства языков программирования, и таким образом вам будет легче писать, проверять, тестировать и поддерживать. Конечно, вы все еще можете использовать регулярное выражение для части решения, но вам это не обязательно. Псевдокод:
m = re.match(r"(?P<before>[0-9]+)(?P<after>\.[0-9]{1,4})?$", input_string)
if not m:
return "no match"
before, after = m.group("before", "after")
after = after[1:] if after else "" # remove period or set to empty string
if len(before) + len(after) > 17:
return "incorrect length"
return "valid"
на вашем любимом языке вы можете выполнить несколько логических проверок, например Python
num="1234567890133.3456"
if "." in num and len(num)==17 :
n=num.split(".")
if len(n[1])>4:
print "cannot have more than 4 decimal places"
elif len(n)==2 and n[0].isdigit() and n[1].isdigit():
print "yes, decimal"
elif len(num)==17 and num.isdigit():
print "%s is number with no decimal and is exactly 17 digits." % num
else:
print "%s not ok, check length is 17" % num
Это не особенно красиво, но с таким небольшим количеством возможностей (0,1,2,3,4 длины мантиссы) я бы, вероятно, просто перечислил их все:
\d{17}|\d{16}\.\d{1}|\d{15}\.\d{2}|\d{14}\.\d{3}|\d{13}\.\d{4}