Регулярное выражение для десятичных чисел - PullRequest
7 голосов
/ 03 марта 2010

Может ли кто-нибудь предоставить регулярное выражение для числа, длина которого должна быть от 1 до 17, и может дополнительно содержать мантиссу до 4 мест? Длина 17 включает в себя как характеристику, так и мантиссу.

Edit:

Длина 17 исключает десятичную точку.

Допустимые примеры:

12345678901234567 
1234567890123.4567 
123456789012345.67
12.34

Invalid:

12345678901234.5678 (Length of numerals = 18)

Спасибо.

Ответы [ 6 ]

5 голосов
/ 03 марта 2010
^\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
3 голосов
/ 03 марта 2010

ОК, это лучшее, что я мог сделать:

/^\d{1,17}$|(?=^.{1,18}$)^\d+\.\d{1,4}$/

В основном, соответствуют 1-17 цифрам или строкам длиной 1-18, которые состоят из двух наборов цифр, разделенных точкой. Правильный набор может содержать от 1 до 4 цифр.

2 голосов
/ 03 марта 2010

Не делайте этого полностью в регулярных выражениях. Проблема становится почти тривиальной в большинстве языков программирования, и таким образом вам будет легче писать, проверять, тестировать и поддерживать. Конечно, вы все еще можете использовать регулярные выражения для части решения, но вам это не нужно. Псевдокод:

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"
1 голос
/ 03 марта 2010

Это не особенно красиво, но с таким небольшим количеством возможностей (мантисса длиной 0,1,2,3,4) я бы, вероятно, просто перечислил бы их все:

\d{17}|\d{16}\.\d{1}|\d{15}\.\d{2}|\d{14}\.\d{3}|\d{13}\.\d{4}
0 голосов
/ 02 января 2013

Я создал это регулярное выражение сверху отличных решений. пусть это поможет любому. Пожалуйста, дайте мне знать, если вы найдете в нем ошибку.
Строка decimalRegex = "" + "^ (?! 0 [\ д,]) \ +?" + // ^ Начало номера
"(\ d {0," + size + "} |" + // Числовое значение без символа группы | (ИЛИ)
"(\ D {0," + бэр (размер, размер группы) + "},)?" + * * 1004 "(\ d {0," + groupSize + "},) {0," + div (size, groupSize) + "} \ d {" + groupSize + "})" + // Числовое значение с символом группы
"((([A-Za-Z] {0,2} | \" | \ ") \ s \ +) |?. \)" +
"(\ D {0," + Масштаб + "})?" + // Десятичное значение без символа группы
"(\ s? ([a-zA-Z] {0,2} | \" | \ ')) $ "; // Заканчивается на

private int rem(int size,int groupSize ){
    int rem = (size - groupSize)%groupSize;
    return rem;
}

private int div(int size,int groupSize ){
    int div = (size - groupSize)/groupSize;
    return div;
}
0 голосов
/ 03 марта 2010

на вашем любимом языке вы можете выполнить несколько логических проверок, например, 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
...