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

#regex

#регулярное выражение

Вопрос:

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

Вот пример того, что у меня есть до сих пор:

 /([0-9] [., ]*) /
  

Это уже довольно хорошо, потому что оно соответствует тому, что я хочу. Единственная проблема заключается в том, что оно также соответствует ‘ ‘ или ‘,’ ‘.’ в конце выражения.

Допустим, у меня есть эта строка:

 The cost of the food was 1 999,49 € without drinks.
  

Я хочу сопоставить 1 999,49 строку. Прямо сейчас мое регулярное выражение соответствует 1 999,49 . То же самое должно произойти, если формат цены отличается, например:

 1,999.49 $ => 1,999.49 (with no whitespace or anything in the end)
  

Как я могу сделать это с помощью регулярных выражений?

Ответ №1:

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

 d (?:[,. ]d )*
  
  • d Сопоставление 1 цифр
  • (?: Не группа захвата
    • [,. ]d Сопоставьте либо пробел , , либо . и 1 цифры
  • )* Закройте группу и повторите 0 раз

Демонстрация регулярных выражений

Немного более точное соответствие может быть

 bd{1,3}(?:[,. ]d{3})*(?:[.,]d{2})?b
  

Демонстрация регулярных выражений

Комментарии:

1. Спасибо, первый, похоже, работает довольно хорошо. Что мне нужно сделать, если я хочу разрешить . быть в конце, но не хочу запятых или пробелов? Это выглядит нормально? d (?:[, ]d )*([.])*

2. @Radical_Activity Тогда вы могли бы рассмотреть шаблон, подобный bd{1,3}(?:[,. ]d{3})*(?:.d{2})?b

3. Спасибо. Возможно ли это сделать с первой формулой? d (?:[,. ]d )*

4.@Radical_Activity Для сопоставления только цифр или части с запятой и точкой в конце d (?:(?:[, ]d ) (?:.d ))? regex101.com/r/vTbjLu/1