Десятичные или числовые значения в проверке регулярного выражения - PullRequest
52 голосов
/ 11 мая 2010

Я пытаюсь использовать проверку регулярного выражения для проверки только десятичных или числовых значений. Но пользователь вводит числовое значение, это не первая цифра "0"

Как мне это сделать?

Ответы [ 10 ]

115 голосов
/ 11 мая 2010

Цифра в диапазоне 1-9, за которой следует ноль или более других цифр:

^[1-9]\d*$

Чтобы разрешить числа с необязательной десятичной точкой, за которой следуют цифры. Цифра в диапазоне от 1 до 9, за которой следует ноль или более других цифр, а затем, возможно, за ними следует десятичная точка, за которой следует не менее 1 цифры:

^[1-9]\d*(\.\d+)?$

Примечания:

  • ^ и $ привязывают к началу и концу, в основном говоря, что вся строка должна соответствовать шаблону

  • ()? соответствует 0 или 1 целого в скобках

Обновление для обработки запятых:

В регулярных выражениях . имеет особое значение - соответствует любому отдельному символу. Чтобы буквально соответствовать . в строке, вам нужно escape ., используя \. Это значение \. в регулярном выражении выше. Так что если вы хотите использовать запятую вместо этого, шаблон просто:

^[1-9]\d*(,\d+)?$

Дальнейшее обновление для обработки запятых и полных остановок

Если вы хотите разрешить . между группами цифр и , между целыми и дробными частями, попробуйте:

^[1-9]\d{0,2}(\.\d{3})*(,\d+)?$

т.е. это цифра в диапазоне 1-9, за которой следуют до 2 других цифр, затем ноль или более групп полного останова, за которыми следуют 3 цифры, а затем, при желании, запятая и цифры, как и раньше.

Если вы хотите разрешить . где-либо между цифрами, попробуйте:

^[1-9][\.\d]*(,\d+)?$

т.е. цифра 1-9, за которой следуют ноль или более цифр или полная остановка, за которыми следуют запятая и одна или несколько цифр.

67 голосов
/ 08 сентября 2016

На самом деле ни один из приведенных ответов не полностью покрывает запрос.
Поскольку ОП не предоставил конкретный вариант использования или типы чисел, я постараюсь охватить все возможные случаи и перестановки.

Обычные номера

Всего положительных

Это число обычно называется целое число без знака , но вы также можете назвать его положительным не дробным числом, включая ноль. Это включает числа как 0, 1 и 99999.
Регулярное выражение, охватывающее эту проверку:

/^(0|[1-9]\d*)$/

Проверьте это регулярное выражение

Всего положительных и отрицательных

Этот номер обычно называется целое число со знаком , но вы также можете назвать его не дробным числом. Это включает числа как 0, 1, 99999, -99999, -1 и -0.
Регулярное выражение, охватывающее эту проверку:

/^-?(0|[1-9]\d*)$/

Проверьте это регулярное выражение

Как вы, наверное, заметили, я также включил -0 в качестве действительного числа. Но некоторые могут поспорить с этим использованием и сказать, что это не реальное число (подробнее о Signed Zero можно прочитать здесь ). Итак, если вы хотите исключить это число из этого регулярного выражения, вот что вы должны использовать вместо этого:

/^-?(0|[1-9]\d*)(?<!-0)$/

Проверьте это регулярное выражение

Все, что я добавил, это (?<!-0), что означает не включать -0 перед этим утверждением. Это (?<!...) утверждение, называемое отрицательный взгляд за , что означает, что любая фраза, заменяющая ..., не должна появляться перед этим утверждением. Lookbehind имеет ограничения, например, фраза не может содержать квантификаторы. Вот почему в некоторых случаях я буду использовать Lookahead, который такой же, но в противоположном направлении.

Многие разновидности регулярных выражений, в том числе используемые в Perl и Python, допускают только строки фиксированной длины. Вы можете использовать буквальный текст, экранирование символов, экранирование Unicode, отличное от \X, и классы символов. Вы не можете использовать квантификаторы или обратные ссылки. Вы можете использовать чередование, но только если все альтернативы имеют одинаковую длину. Эти ароматы оценивают взгляд сзади, сначала возвращаясь назад через строку темы на столько символов, сколько нужно взгляду сзади, а затем пытаясь выполнить регулярное выражение внутри взгляда слева направо.

Вы можете прочитать больше об утверждениях Lookaround здесь .

Дробные числа

Положительный

Это число обычно называется без знака с плавающей запятой или без знака двойного , но вы также можете назвать его положительным дробным числом, включая ноль. Это включает в себя числа, такие как 0, 1, 0.0, 0.1, 1.0, 99999.000001, 5.10.
Регулярное выражение, охватывающее эту проверку:

/^(0|[1-9]\d*)(\.\d+)?$/

Проверьте это регулярное выражение

Некоторые могут сказать, что числа типа .1, .0 и .00651 (как и 0.1, 0.0 и 0.00651 соответственно) также являются действительными дробными числами, и я не могу с ними не согласиться. Итак, вот регулярное выражение, которое дополнительно поддерживает этот формат:

/^(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/

Проверьте это регулярное выражение

Отрицательный и положительный

Этот номер обычно называется со знаком с плавающей запятой или со знаком двойной , но вы также можете назвать его дробным числом. Сюда входят числа типа 0, 1, 0.0, 0.1, 1.0, 99999.000001, 5.10, -0, -1, -0.0, -0.1, -99999.000001, 5.10.
Регулярное выражение, охватывающее эту проверку:

/^-?(0|[1-9]\d*)(\.\d+)?$/

Проверьте это регулярное выражение

Для не -0 верующих:

/^(?!-0(\.0+)?$)-?(0|[1-9]\d*)(\.\d+)?$/

Проверьте это регулярное выражение

Для тех, кто хочет также поддерживать невидимые нулевые представления, такие как .1, -.1, используйте следующее регулярное выражение:

/^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/

Проверьте это регулярное выражение

Сочетание не -0 верующих и невидимых нулевых верующих, используйте это регулярное выражение:

/^(?!-0?(\.0+)?$)-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/

Проверьте это регулярное выражение

Числа с научной нотацией (AKA Exponential Notation)

Некоторые могут захотеть поддержать в своих валидациях числа с научным характером e, что, кстати, является абсолютно действительным числом, оно создано для краткого представления очень длинных чисел. Вы можете прочитать больше о научной нотации здесь . Эти числа обычно выглядят как 1e3 (что составляет 1000), 1e-3 (что составляет 0,001) и полностью поддерживаются многими основными языками программирования (например, JavaScript). Вы можете проверить это, проверив, возвращает ли выражение '1e3'==1000 true.
Я разделю поддержку всех вышеперечисленных разделов, в том числе номера с научными обозначениями.

Обычные номера

Проверка регулярных выражений для целых положительных чисел, поддерживает такие числа, как 6e4, 16e-10, 0e0, но также и обычные числа, такие как 0, 11:

/^(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i

Проверьте это регулярное выражение

Проверка регулярного выражения целых положительных и отрицательных чисел, поддерживает такие числа, как -6e4, -16e-10, -0e0, но также и обычные числа, такие как -0, -11 и все целые положительные числа, указанные выше:

/^-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i

Проверьте это регулярное выражение

Проверка регулярного выражения целых положительных и отрицательных чисел для не -0 верующих, такая же, как указано выше, за исключением того, что теперь она запрещает такие числа, как -0, -0e0, -0e5 и -0e-6:

/^(?!-0)-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i

Проверьте это регулярное выражение

Дробные числа

Проверка регулярного выражения положительного числа, поддерживает также целые числа, указанные выше, плюс такие числа, как 0.1e3, 56.0e-3, 0.0e10 и 1.010e0:

/^(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i

Проверьте это регулярное выражение

Положительное число с проверкой регулярного выражения невидимого нуля, поддерживает также вышеуказанные положительные числа, в дополнение к таким номерам, как .1e3, .0e0, .0e-5 и .1e-7:

/^(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i

Проверьте это регулярное выражение

Проверка регулярного выражения отрицательных и положительных чисел, поддерживает положительные числа, указанные выше, но также такие числа, как -0e3, -0.1e0, -56.0e-3 и -0.0e10:

/^-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i

Проверьте это регулярное выражение

Проверка регулярного выражения отрицательных и положительных чисел для не -0 верующих, такая же, как указано выше, за исключением того, что теперь она запрещает такие числа, как -0, -0.00000, -0.0e0, -0.00000e5 и -0e-6:

/^(?!-0(\.0+)?(e|$))-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i

Проверьте это регулярное выражение

Отрицательное и положительное число с проверкой регулярных выражений невидимого нуля, поддерживает также вышеуказанные положительные и отрицательные числа, в дополнение к таким номерам, как -.1e3, -.0e0, -.0e-5 и -.1e-7:

/^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i

Проверьте это регулярное выражение

Отрицательное и положительное число с комбинацией не -0 верующих и невидимых нулевых верующих, такое же, как указано выше, но запрещает такие номера, как -.0e0, -.0000e15 и -.0e-19:

/^(?!-0?(\.0+)?(e|$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i

Проверьте это регулярное выражение

Числа с шестнадцатеричным представлением

Во многих языках программирования строковое представление шестнадцатеричного числа, например 0x4F7A, может быть легко приведено к десятичному числу 20346.
Таким образом, кто-то может захотеть поддержать это в своем сценарии проверки.
Следующее регулярное выражение поддерживает только шестнадцатеричные представления чисел:

/^0x[0-9a-f]+$/i

Проверьте это регулярное выражение

Все перестановки

Эти последние регулярные выражения поддерживают невидимые нулевые числа.

Подписавшие верующих нулей

/^(-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)$/i

Проверьте это регулярное выражение

Не подписавшие верующих нулей

/^((?!-0?(\.0+)?(e|$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)$/i

Проверьте это регулярное выражение

Надеюсь, я рассмотрел все перестановки чисел, которые поддерживаются во многих языках программирования.
Удачи!


О, забыл упомянуть, что те, кто хочет проверить число, включает разделитель тысяч, сначала вы должны очистить все запятые (,), так как там может быть разделитель любого типа, вы не можете на самом деле покрыть их всех.
Но вы можете удалить их сначала, до проверки номера:

//JavaScript
function clearSeparators(number)
{
    return number.replace(/,/g,'');
}

Подобный пост в моем блоге .

7 голосов
/ 05 мая 2011

У меня была такая же проблема, но я также хотел, чтобы ".25" было допустимым десятичным числом. Вот мое решение с использованием JavaScript:

function isNumber(v) {
  // [0-9]* Zero or more digits between 0 and 9  (This allows .25 to be considered valid.)
  // ()? Matches 0 or 1 things in the parentheses.  (Allows for an optional decimal point)
  // Decimal point escaped with \.
  // If a decimal point does exist, it must be followed by 1 or more digits [0-9]
  // \d and [0-9] are equivalent 
  // ^ and $ anchor the endpoints so tthe whole string must match.
  return v.trim().length > 0 && v.trim().match(/^[0-9]*(\.[0-9]+)?$/);
}

Где мой метод trim ()

String.prototype.trim = function() {
  return this.replace(/(^\s*|\s*$)/g, "");
};

Мэтью ДесВойн

6 голосов
/ 01 июля 2015

Я протестировал все заданные регулярные выражения, но, к сожалению, никто из них не прошел эти тесты:

    String []goodNums={"3","-3","0","0.0","1.0","0.1"};
    String []badNums={"001","-00.2",".3","3.","a",""," ","-"," -1","--1","-.1","-0", "2..3", "2-", "2...3", "2.4.3", "5-6-7"};

Вот лучшее из написанного мной, которое прошло все эти тесты:

"^(-?0[.]\\d+)$|^(-?[1-9]+\\d*([.]\\d+)?)$|^0$"

enter image description here

2 голосов
/ 04 августа 2014

Вот отличное рабочее выражение для чисел. Это принимает число с запятыми и десятичными знаками.

/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/
1 голос
/ 31 октября 2017

Попробуйте этот код, надеюсь, он вам поможет

String regex = "(\\d+)(\\.)?(\\d+)?";  for integer and decimal like 232 232.12 
1 голос
/ 09 мая 2016

/([0-9]+[.,]*)+/ соответствует любому числу с или без запятой или точек

может соответствовать

         122
         122,354
         122.88
         112,262,123.7678

ошибка: она также соответствует 262.4377,3883 (но это не имеет особого значения)

1 голос
/ 05 декабря 2015

Вот мое регулярное выражение для проверки чисел:

^(-?[1-9]+\\d*([.]\\d+)?)$|^(-?0[.]\\d*[1-9]+)$|^0$

Допустимые числа:

String []validNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};

Неверные номера:

String []invalidNumbers={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};
0 голосов
/ 09 июля 2015

Ниже идеально подходит для упомянутых требований:

^[0-9]{1,3}(,[0-9]{3})*(([\\.,]{1}[0-9]*)|())$
0 голосов
/ 17 февраля 2015

, если вам нужно проверить десятичность с точками, запятыми, положительными и отрицательными значениями, попробуйте это:

Object testObject = "-1.5";
boolean isDecimal = Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,]{1}[0-9]+$", (CharSequence) testObject);

Удачи.

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