Подсказки для сложного валюты регулярного выражения для Javascript? - PullRequest
1 голос
/ 17 июня 2009

Мне нужно сопоставить бесконечное число цифр на веб-странице.

Мне нужно соответствовать всем следующим форматам:

100 $
99$
$99
$ 8
$.99
$ .8
$ 99.8
.99$
.99 $
9.2 $
1.2$

И эквивалент с использованием запятых:

444,333
22,333
1,222
11,111,111
333,333,333,333.01132

Или пробелы:

444 333
22 333
1 222
11 111 111
333 333 333 333.01132

Это действительно сложный вопрос для меня. Я привык играть с регулярным выражением, но мне не удалось написать что-то пуленепробиваемое. Обычно http://www.regexlib.com имеет решение, но не для этого.

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

Ответы [ 3 ]

6 голосов
/ 17 июня 2009

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

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

Чтобы разбить его:

  • ^(?:\$\s*)? будет искать дополнительный $ в начале строки, за которым следует любое количество пробелов
  • (?:(?:\d{0,3}(?:[, ]\d{0,3])*[, ])+\d{3}|\d*) будет соответствовать либо числу, разбитому на группы, разделенные запятой или пробелом (\d{0,3}(?:[, ]\d{0,3})*[, ])+\d{3}), либо строке чисел (\d+) - так что 123 456 789, 123 456 789 и 123456789 будут совпадать , Регулярное выражение не будет принимать числа с неправильной группировкой (поэтому 123,45,6789 не будут совпадать)
  • (?:\.\d*)? будет сопоставлять число с необязательным десятичным знаком и любое количество чисел после
  • (?:\s*\$)?$ будет соответствовать необязательному $ в конце строки, которому предшествует любое количество пробелов.
5 голосов
/ 17 июня 2009

Зачем писать 1 регулярное выражение, если вы можете написать несколько и применять их по очереди?

Я предполагаю (?), Что вы можете перебирать построчно. Почему бы не попробовать использовать регулярное выражение, запутанное в запятых, а затем использовать регулярное выражение в пространстве и т. Д.? Если один из них совпадает, не пытайтесь попробовать остальные, сохраняйте результаты и переходите к следующей строке.

0 голосов
/ 17 июня 2009

что делать в 2 этапа:

сначала замените все пробелы на ''

тогда, если форматирование чисел всегда одинаково, вы можете заменить запятые на ''

после этого все довольно просто, нет?

...