Регулярное выражение для совпадения числа с десятичным разделителем и необязательным разделителем тысяч - PullRequest
0 голосов
/ 18 декабря 2018

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

Так что следующие комбинации будут допустимы (Использование .в качестве десятичного разделителя и , в качестве разделителя тысяч)

  • 10000
  • 100 000 000
  • 100 000 000,345345
  • 10000.689

Но следующее не будет законным:

  • 10000,000,000.34534

В основном я хочу числа с правильным использованием десятичного разделителя и разделителя тысяч или без них вообще,но не недействительные комбинации.Я много осматривался, пока нашел этот пост .У которого есть отличное регулярное выражение, которое идеально подходит, когда числа имеют десятичный разделитель и разделитель тысяч, но когда я пытаюсь добавить другие параметры (числа только с десятичным разделителем или целые числа), я разбиваю выражение.

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

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

Первая группа - это выражение из другого поста, вторая, я думаю, охватываетчисла с десятичным разделителем и последним являются целыми числами, но он не работает.

Например, эти числа не совпадают:

  • 10000000.56
  • 10000000

Я думаю, проблема в том, что это происходит, потому что это всегда тест для первой группы, но я не уверен, как правильно использовать группы, чтобы они соответствовали любой из них.Кроме того, я думаю, что размещаю знаки - + не в том месте.

Я много искал и не смог найти ни одного выражения, которое работало правильно.Из предложенных:

Из регулярного выражения для числа с десятичными знаками и разделителем тысяч post

  • ((\d){1,3})+([,][\d]{3})*([.](\d)*)? -> Он ошибочно захватывает 10000000 и 10 000 000.
  • ^(?!0+\.00)(?=.{1,9}(\.|$))\d{1,3}(,\d{3})*(\.\d+)?$ -> для 10000000
  • /^(?!0+\.00)(?=.{1,9}(\.|$))(?!0(?!\.))\d{1,3}(,\d{3})*(\.\d+)?$/ -> он не работает для 10000000
  • ((\d){1,3})+([,][\d]{3})*([.](\d)*)? -> для -100.03

Это Могу ли я использовать ИЛИ в регулярном выражении без захвата содержимого? сообщение не является дубликатом, оно объясняет что-то, что может помочь мне решить проблему, но это не дубликат, особенно потому, чтоУ меня есть проблемы также со знаком + -.Кроме того, мои вопросы касаются проблемы, которая не является особенной для меня, это проблема, с которой сталкиваются многие люди, но из обнаруженных мною реализаций ни одна не работает.

С RegEx сопоставление числовых значений с илибез разделителей тысяч post

  • ^-?([0-9]{1,3}\.?)+$ -> Сбой для -1000, но не для и не для 100.00.3
  • ^-?(?!0)(?:\d+|\d{1,3}(?:\.\d{3})+)$ -> Сбой для -100,03

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

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

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

Демонстрация RegEx

Соответствует следующим случаям:

  • Целое числочисло
  • число с плавающей запятой
  • число с разделителями в виде , на 3-м месте
0 голосов
/ 18 декабря 2018

Причина, по которой второй вариант не совпадает, заключается в том, что он допускает только один \f после десятичной точки.Это должно быть \d+.

Тогда вам нужно обернуть все между ^ и $ в группе, чтобы все варианты соответствовали всей строке.

У вас было многолишние скобки.И \d* в последней альтернативе должно быть \d+, в противном случае вы допустите полностью пустое число или просто знак.

^[+-]?([0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?|\d*\.\d+|\d+)$
  • ^ -> начало строки
  • [+-]? -> совпадения необязательно + или - char
  • ([0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?|\d*\.\d+|\d+) -> вся группа должна совпадать [0-9]{1,3}(,[0-9]{3})*(\.[0-9]+) или \d*\.\d+ или \d+
    • [0-9]{1,3}(,[0-9]{3})*(\.[0-9]+) -> сопоставляет числа с тысячным разделителем и, возможно, десятичным разделителем
    • \d*\.\d+ -> сопоставляет числа с десятичным разделителем и, возможно, цифры перед десятичным разделителем
    • \d+ -> соответствует числам без десятичного разделителя
  • $ -> конец строки

DEMO

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