Проверьте список номеров через запятую с помощью регулярного выражения - PullRequest
1 голос
/ 07 февраля 2020

Эти случаи должны совпадать:

1.23
1
1,
1.2,4
1.23, 4
1.23, 4,
1, 2.34
1.

Эти случаи не должны:

1,,
1.234

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

Я сделал это регулярное выражение, но оно не работает для чисел с более чем двумя фракциями: https://regex101.com/r/CLTP2j/75

/^(?:\d+(?:\.[\d{1,2}]*)?|\.[\d{1,2}]+)(?:,[\s]?(?:\d+(?:\.[\d{1,2}]*)?|\.[\d{1,2}]+))*$/

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

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

r1 = /(?<!,), ?/
r2 = /^\d+(?:\.\d{,2})?$/

Шаги:

  • используйте r1, чтобы разбить строку на одну или несколько подстрок
  • определить, соответствуют ли все подстроки r2

r1 читает, "соответствует запятой, за которой следует не более одного пробела, и перед ней не стоит запятая.

r2 читает," соответствует одной или нескольким цифрам в начале строки, необязательно, за которым следует десятичная точка, затем 0, 1 или 2 цифры, за которыми следует конец строки ".

В Ruby, например, получается следующее:

arr =<<~END.split("\n")
1.23
1
1,
1.2,4
1.23, 4
1.23, 4,
1, 2.34
1,  2.34
1,,
1.234
END
  #=> ["1.23", "1", "1,", "1.2,4", "1.23, 4", "1.23, 4,", "1, 2.34",
  #    "1,  2.34", "1,,", "1.234"] 

arr.each do |s|
  a = s.split r1
  result = a.all? { |t| t.match? r2 } ? "(Match)" : "(No match)"
  puts "%-9s: %-14s %s" % [s, a.inspect, result]
end

string     array          match?
---------------------------------
1.23     : ["1.23"]       (Match)
1        : ["1"]          (Match)
1,       : ["1"]          (Match)
1.2,4    : ["1.2", "4"]   (Match)
1.23, 4  : ["1.23", "4"]  (Match)
1.23, 4, : ["1.23", "4"]  (Match)
1, 2.34  : ["1", "2.34"]  (Match)
1,  2.34 : ["1", " 2.34"] (No match)
1,,      : ["1", ","]     (No match)
1.234    : ["1.234"]      (No match)

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

0 голосов
/ 07 февраля 2020

Используйте следующее регулярное выражение:

^\d+(?:\.\d{0,2})?(?:,\s*\d+(?:\.\d{0,2})?)*,?$

Демо

Вместо того, чтобы давать типичный подробный (и неразборчиво) полный анализ Шаблон, который я использовал, я вместо этого объясню более простое требование. Допустим, вы хотели проверить список заглавных букв CSV, например,

A,B,C

Шаблон, который вы бы использовали:

^[A-Z](?:,[A-Z])*,?$

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

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