Coldfusion - как получить все значения из строки с помощью регулярного выражения

Я пытаюсь получить все экземпляры значений из строки. например, the offer would be from £12,000 to £15,000.05 over 6 years with the allowance of 32 extras

вернет 12,000 и 15 15,000.05

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

Я нашел эту сумму из суммы Extract from string - regex в PHP

который я превратил в:

Но alas valuesfound подходит как пустой массив.

Любая помощь будет очень благодарна.

4 ответа

Я хочу, чтобы regex сказал: "Получите все значения между £ и пробелом"

£(\S+)

DEMO

ИЛИ

(?<=£)\S+

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

DEMO


Легкое регулярное выражение для захвата чисел будет:

£(\d[\d,.]*)

Номер доступен для группы 1.

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

Заметим, что £3.5,5.2 или £3...,,2 или £3. или £3, может быть сопоставлено регулярным выражением выше. Но, по крайней мере, это несколько более разумно, чем получение £-sign в качестве матча.

Однако lax regex используется только для извлечения информации. Не используйте его для проверки.

Если вы хотите более сильное регулярное выражение:

£((?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?)

Пример самых сумасшедших вещей, которые может соответствовать этому регулярному выражению:

£1
£0000
£0000.00000
£0.33
£0.234235234
£0001340590783445
£0.4
£234,444.2344
£789
£59.2

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


Изменение: я забыл учитывать десятичные числа, исправлено.


(?<=£)\d+(,?\d{3})*(\.\d+)?

Это будет соответствовать только правильно отформатированным номерам. См. Демонстрацию.

Объяснение:

(?<=£) # assert there a "£" here
\d+ # consume as many digits as possible
(,?\d{3})* # consume a "," followed by exactly 3 digits, any number of times.
(\.\d+)? # finally, match "." followed by at least one digit - if possible.

licensed under cc by-sa 3.0 with attribution.