Десяткове число регулярний вираз, де цифра після десяткової необов'язково


112

Мені потрібен регулярний вираз, який підтверджує число, але не потребує цифри після десяткової. тобто.

123
123.
123.4

все було б дійсним

123..

було б недійсним

Будь-хто буде дуже вдячний!


Найкращою відповіддю тут: stackoverflow.com/a/39399503/715269
Гангнус

Відповіді:


190

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

/^\d*\.?\d*$/
  • ^ - Початок рядка;
  • \d* - 0 і більше цифр;
  • \.?- необов'язкова точка (втекла, тому що в регулярному вираженні .є особливим символом);
  • \d* - 0 або більше цифр (десяткова частина);
  • $ - Кінець лінії.

Це дозволяє використовувати


2
@OrangeDog, ваші оригінальні збіги більше, ніж можливо. напр., «корова3.45tornado»;)
С.

39
Він також відповідає одній крапці, яка не є дійсним десятковим числом. Краще виражене зворотне вираження, /^\d*\.?\d+$/яке змусило би цифру після десяткової крапки.
Чандраншу

2
@Chandranshu, і він відповідає порожній рядку, який також змінить ваша зміна.
OGHaza

2
@Chandranshu "не потребує цифри після десяткової"
OrangeDog

3
Це рішення не працює. Він вимагає десяткових знаків, тоді як ОП чітко говорить: необов'язкові десяткові знаки.
Алекс Г

113
/\d+\.?\d*/

Одна або кілька цифр ( \d+), необов'язковий період ( \.?), нуль або більше цифр ( \d*).

Залежно від двигуна використання або регулярного вибору, вам може знадобитися додати початкові / кінцеві рядки:

/^\d+\.?\d*$/

Регулярна візуалізація виразів

Демогрійна демонстрація


12
Так, але відповідь вгорі проголошена неправильно, вона відповідає обом .і порожній рядку.
OrangeDog

1
@Gangnus Також не сказано, що ".digit" має відповідати. Якби вони цього хотіли, то мали б сказати.
OrangeDog

2
@EqualityInTech Я впевнений, що це не так - у нього немає групування взагалі.
OrangeDog

1
Хм ... я думаю, що я не можу до кінця зрозуміти злісні виразки, як я думав. Вибачте.
JDB досі пам’ятає Моніку

1
@AlexanderRyanBaggett відповідає тому, що вказано в питанні. Як бачите, він зовсім не включає -.
OrangeDog

74

Для правильного його виконання потрібен регулярний вираз на зразок наступного:

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

Те саме вираження з пробілом, використовуючи розширений модифікатор (як підтримується Perl):

/^  [+-]? ( (\d+ (\.\d*)?)  |  (\.\d+) ) $/x

або з коментарями:

/^           # Beginning of string
 [+-]?       # Optional plus or minus character
 (           # Followed by either:
   (           #   Start of first option
     \d+       #   One or more digits
     (\.\d*)?  #   Optionally followed by: one decimal point and zero or more digits
   )           #   End of first option
   |           # or
   (\.\d+)     #   One decimal point followed by one or more digits
 )           # End of grouping of the OR options
 $           # End of string (i.e. no extra characters remaining)
 /x          # Extended modifier (allows whitespace & comments in regular expression)

Наприклад, він буде відповідати:

  • 123
  • 23.45
  • 34.
  • .45
  • -123
  • -273,15
  • -42.
  • -.45
  • +516
  • +9,8
  • +2.
  • +.5

І відкине ці неномери:

  • . (одна десятковий знак)
  • -. (від’ємна десяткова крапка)
  • +. (плюс десяткова крапка)
  • (порожній рядок)

Простіші рішення можуть неправильно відхилити дійсні числа або співставити ці неномери.


1
Найкраще, тому що воно відповідає числу, за яким слід період (42.) Однак є помилка / хибний позитив, оскільки він відповідає цьому: 3 .... 3, який можна виправити, додавши ще дві дужки, щоб застосувати ^ $ початкові та кінцеві символи: / ^ ([+ -]? (\ D + (\ . \ d *)?) | (\. \ d +)) $ /
Піт Елвін

1
Спасибі Піт, добре помічений. Відповідь тепер виправлена, додавши додаткові дужки, щоб вона вела себе за призначенням. Зараз це написано як ^A?(B|C)$. Раніше писалося так, ^A?B|C$що насправді означає, (^A?B)|(C$)що було неправильно. Примітка: ^(A?B|C)$також невірно, оскільки це насправді означає, ^((A?B)|(C))$що не відповідатиме "+.5".
Хойлен

2
Це найкраща відповідь. Інші відповіді стосуються не всіх випадків. Я роблю подібну річ самостійно, за винятком того, що використовую підказку для обробки випадків пропуску цифр: /^ evidence+-Sense?(?=\d|\.\d)\d*(\.\d*)?$ /
PhilHarvey

1
Це єдиний правильний регулярний вираз. Але деякі люди не погоджуються з "34". Я б запропонував + після другого d замість *
Gangnus

1
Це також відповідає 0000.2, що, мабуть, не є бажаним.
Аарон Зорель

11

Спробуйте цей регулярний вираз:

\d+\.?\d*

\ d + цифри перед необов'язковим десятковим
.? необов'язковий десятковий (необов’язковий через? квантор)
\ d * необов'язкові цифри після десяткових


1
Ні, це не відповідає123.
Барт Кірс

1
Дякую за замітку. Змінив мій регулярний вираз.
Каш

4
Дійсно, але тепер ви просто відредагували це, що вже розміщено кимось іншим. Подумайте просто видалити ще одну «правильну» відповідь.
Барт Кіерс

10

Я думаю, що це найкраще, оскільки воно відповідає всім вимогам:

^\d+(\\.\d+)?$

1
Для мене це найкраща відповідь, оскільки рядок: "4." (наприклад) не є дійсним числом принаймні в рубіновій мові. Однак найбільш відповідні відповіді приймають "4." як числовий регулярний вираз, що неправильно.
Віктор

3

Я в кінцевому рахунку використовував наступне:

^\d*\.?\d+$

Це робить такі недійсними:

.
3.

Можливо, вам знадобляться косої риски залежно від мови, якою ви користуєтесь. Наприклад: /^\d*\.?\d+$/
Чарльз Наччо

це дозволить.3
Рой Намір

3

Ви можете скористатися цим:

^\d+(\.\d)?\d*$

матчі:
11
11,1
0,2

не відповідає:
.2
2.
2.6.9


Дякую, дуже просто і відповідає тому, що мені потрібно
Hany


2

Це я і зробив. Це більш суворо, ніж будь-яке з перерахованих вище (і правильніше, ніж деякі):

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

Рядки, що проходять:

0
0.
1
123
123.
123.4
.0
.0123
.123
0.123
1.234
12.34

Рядки, які не вдається:

.
00000
01
.0.
..
00.123
02.134

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

має відображати те, що люди зазвичай вважають добре сформованим десятковим числом.

Цифри перед десятковою комою можуть бути або однією цифрою, і в цьому випадку це може бути від 0 до 9, або більше однієї цифри, і в цьому випадку вона не може починатися з 0.

Якщо перед десятковим знаком є ​​будь-які цифри, то десяткові та наступні за ним цифри необов’язкові. В іншому випадку має бути десятковою особою, що супроводжується принаймні однією цифрою. Зауважте, що після десяткової крапки дозволено кілька знаків 0.

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

правильно відповідає наступному:

9
0
10
10.
0.
0.0
0.100
0.10
0.01
10.0
10.10
.0
.1
.00
.100
.001

а також їх підписані еквіваленти, тоді як він відкидає наступне:

.
00
01
00.0
01.3

та їх підписані еквіваленти, а також порожній рядок.


1
(?<![^d])\d+(?:\.\d+)?(?![^d])

чистий і простий.

Для цього використовуються функції Suffix і Prefix, RegEx.

Це безпосередньо повертає true - false для умови IsMatch


1
^\d+(()|(\.\d+)?)$

Придумав це. Дозволяє як цілі, так і десяткові, але примушує вводити повну десяткову (провідні та кінцеві числа), якщо ви вирішили ввести десятковий.


1

Те, що ви запитували, вже відповів, тому це лише додаткова інформація для тих, хто хоче лише 2 десяткових цифри, якщо вводиться необов'язковий десятковий знак:

^\d+(\.\d{2})?$

^: початок рядка
\ d: цифра (дорівнює [0-9])
+: один і необмежений раз

Захоплення групи (. \ D {2})?
? : нуль і один раз. : характер.
\ d: цифра (дорівнює [0-9])
{2}: рівно в 2 рази
$: кінець рядка

1: матч
123: матч
123.00: матч
123.: немає матчу
123 ..: немає матчу
123.0: немає матчу
123.000: немає матчу
123.00.00: немає відповідності


Чи відповідає це від’ємним числом?
Олександр Райан

1
@AlexanderRyanBaggett вам потрібно перевірити наявність від'ємного знаку, щоб це було: ^ -? \ D + (\. \ D {2})? $
PersyJack

0

У Perl використовуйте Regexp :: Common, що дозволить вам зібрати чітко налаштований регулярний вираз для вашого конкретного формату числа. Якщо ви не використовуєте Perl, згенерований регулярний вираз все ще може використовуватися іншими мовами.

Друк результату генерації прикладних регулярних виразів у Regexp :: Загальний :: Число:

$ perl -MRegexp::Common=number -E 'say $RE{num}{int}'
(?:(?:[-+]?)(?:[0123456789]+))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)(?:[0123456789]+))|))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}{-base=>16}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789ABCDEF])(?:[0123456789ABCDEF]*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[-+]?)(?:[0123456789ABCDEF]+))|))

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.