Подтвердить что ты не робот

Десятичные или числовые значения в проверке регулярных выражений

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

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

4b9b3361

Ответ 1

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

^[1-9]\d*$

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

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

Примечания:

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

  • ()? соответствует 0 или 1 всего объекта между скобками

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

Регулярные числа

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

Это число обычно называют целым числом без знака, но вы также можете назвать его положительным не дробным числом, включая ноль. Это включает числа как 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, что означает, что любая фраза, заменяющая ... не должна появляться перед этим утверждением. 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 верующих, как и выше, за исключением того, что теперь оно запрещает такие номера, как -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, -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,'');
}

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

Ответ 3

У меня была та же проблема, но я также хотел, чтобы ".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, "");
};

Мэтью Десвоян

Ответ 4

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

    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

Ответ 5

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

/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/

Ответ 6

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

^(-?[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"};

Ответ 7

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

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

         122
         122,354
         122.88
         112,262,123.7678

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

Ответ 8

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

String regex = "(\\d+)(\\.)?(\\d+)?";  for integer and decimal like 232 232.12 

Ответ 9

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

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

Удачи.

Ответ 10

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

^[0-9]{1,3}(,[0-9]{3})*(([\\.,]{1}[0-9]*)|())$

Ответ 11

как дать условие для A-103 этого типа выражения в регулярных выражениях?