Regex для чисел, допускающих только пробелы и 1 запятую или точку - PullRequest
0 голосов
/ 25 апреля 2019

Я изо всех сил пытаюсь сделать регулярное выражение, соответствующее следующим условиям:

  • Только числа
  • Допустимые пробелы (разрывные и неразрывные), но не более одного последовательного пробела
  • Только одна запятая , ИЛИ только одна точка . разрешено (не оба)
  • Редактировать: Начальным и конечным символом должен быть номер или знак - (максимум 1 -)

Это должно соответствовать таким строкам, как: 4564654, 4 454 845 484, 874584.42, 42 424 484.45, 874584,42, 42 424 484,45 ...

И не совпадают 42a, 42.45,42 ...

Я пытался расширить это: ^[0-9[,.!?]*$, но у меня ничего не получается.

Ответы [ 4 ]

2 голосов
/ 25 апреля 2019

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

^\d+(?:[,.]\d+)?(?: \d+(?:[,.]\d+)?)*$

Это будет соответствовать

  • ^ Начало строки
  • \d+(?:[,.]\d+)? Совпадение цифр 1+ с необязательной частью для совпадения с точкой или запятой, за которыми следуют цифры 1+
  • (?: \d+(?:[,.]\d+)?)* повтор предыдущей части 0+время с пробелом в начале
  • $ Конец строки

Regex demo

Обновление

Если строка может содержать только одну точку или запятую:

^(?!(?:[^.,\n]*[.,]){2})\d+(?:[,.]\d+)?(?:[^\S\n\r]\d+(?:[,.]\d+)?)*$
  • ^ Начало строки
  • (?!(?:[^.,\n]*[.,]){2}) Отрицательный взгляд вперед, подтвердитьто, что справа, не в 2 раза больше точки или запятой
  • \d+(?:[,.]\d+)? Совпадение 1+ цифр, опционально совпадение точки или запятой и 1+ цифр
  • (?: Группа без захвата
    • [^\S\n\r] Класс отрицательных символов , не соответствует непробельному символу и не соответствует символу новой строки
    • \d+(?:[,.]\d+)? Соответствует 1+ цифрам, дополнительно соответствуетточка или запятая и 1+ цифры
    • )* Закрыть группу без захвата и повторить 0+ раз
  • $ Конец строки

Regex demo

let regex = /^(?!(?:[^.,\n]*[.,]){2})\d+(?:[,.]\d+)?(?:[^\S\n\r]\d+(?:[,.]\d+)?)*$/;
[
  "424242424",
  "424242.424",
  "454545.58",
  "4545454,4545",
  "45454,45",
  "4 45 44454.45",
  "4 454 454,45",
  "1 2 3",
  "1 2 3",
  "4,2 424 484,45 34.4 3 4",
  "545g45",
  "454.454.45",
  "45454,454,45",
  "45.44,45",
  "45,45.45",
  "4 4545 4545 45  45",
].forEach(s => console.log(s + ": " + regex.test(s)))
1 голос
/ 25 апреля 2019

Вы можете использовать это регулярное выражение,

^(?=^[\d ]+[,.]?[\d ]+$)\d+(?:[ .,]\d+)*$

Здесь (?=^[\d ]+[,.]?[\d ]+$) положительный взгляд вперед гарантирует, что присутствует только одна запятая или точка, в то время как \d+(?:[ .,]\d+)* заботится о формате и разрешенных символах.

Regex Demo

0 голосов
/ 25 апреля 2019

Используйте это ^(\d*? ?\d)+(,|\.)?\d+$

контрольные примеры https://regex101.com/r/DDdvf3/4

0 голосов
/ 25 апреля 2019

Сначала несколько цифр или пробелов:

^[0-9 ]*

затем запятая или точка:

(\.|,)?

Затем, еще несколько цифр и / или пробелов, и конец выражения:

[0-9 ]*$

Вместе:

^[0-9 ]*(.|,)?[0-9 ]*$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...