Как сопоставить с JavaScript и регулярное выражение? - PullRequest
0 голосов
/ 27 мая 2009

У меня есть следующий HTML:

<span id="UnitCost5">$3,079.95 to $3,479.95</span>

И я хочу использовать Javascript и Regex, чтобы получить все совпадения чисел.

Итак, я хочу, чтобы моя функция скрипта возвращала: 3 079,95 И 3 479,95

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

<span id="UnitCost5">$3,079.95 And Price $3,479.95</span>

Ответы [ 6 ]

3 голосов
/ 27 мая 2009

Все числа будут соответствовать:

\.?\d[\d.,]*

Предполагается, что искомые числа могут начинаться с десятичной точки. Если они не могут, это сработает (и, возможно, даст меньше ложных срабатываний):

\d[\d.,]*

Имейте в виду, что в форматировании чисел существуют различные местные обычаи.

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

1 голос
/ 27 мая 2009
/(?:\d{1,3},)*\d{1,3}(?:\.\d+)?/g;

Давайте разберем это на части для объяснений:

  • (?: \ D {1,3},) * - Совпадение любых чисел, разделенных делителем на тысячу
  • \ d {1,3} - сопоставить числа перед десятичной точкой
  • (?:. \ D +) - соответствует произвольному количеству десятичных знаков
  • Флаг 'g' - выполнить глобальный поиск, чтобы найти все совпадения в строке

Вы можете использовать это так:

var regex = /(?:\d{1,3},)*\d{1,3}(?:\.\d+)?/g;
var numbers = "$3,079.95 And Price $3,479.95".match(regex);
// numbers[0] = 3,079.95
// numbers[1] = 3,479.95
1 голос
/ 27 мая 2009

Вы не хотите захватывать все числа, иначе вы также получите 5 в идентификаторе. Я думаю, вы ищете цифры, которые выглядят так: $#,###.##

Вот выражение для этого:

/\$[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?/
  • \$ Знак доллара
  • [0-9]{1,3} От одной до трех цифр
  • (,[0-9]{3})* [Необязательно]: тройные цифры, перед которыми стоит запятая
  • (\.[0-9]+)? [Необязательно]: еще больше цифр, перед которыми стоит точка
0 голосов
/ 27 мая 2009

Далее будет возвращен массив всех цен, найденных в строке

function getPrices(str) {
    var reg = /\$([\d,.]+)/g;
    var prices =[];
    var price;
    while((price = reg.exec(str))!=null) {
        prices.push(price);
    }
    return prices;
}

edit: обратите внимание, что само регулярное выражение может возвращать некоторые ложные срабатывания

0 голосов
/ 27 мая 2009
(function () {
    var reg = /\$([\d\.,]+)\s[\w\W]+\s\$([\d\.,]+)$/;


    // this function used to clean inner html
    function trim(str) {
        var str = str.replace(/^\s\s*/, ''),
            ws = /\s/,
            i = str.length;
        while (ws.test(str.charAt(--i)));
        return str.slice(0, i + 1);
    }

    function getNumbersFromElement(elementId) {
        var el = document.getElementById(elementId),
            text = trim(el.innerHTML), 
            firstPrice,
            secondPrice,
            result;

        result = reg.exec(text);

        if (result[1] && result[2]) {
            // inside this block we have valid prices
            firstPrice = result[1];
            secondPrice = result[2];
            // do whatever you need
            return firstPrice + ' AND ' + secondPrice;
        } else {
            return null; // otherwise 
        }
    }
    // usage:
    getNumbersFromElement('UnitCost5');
})();
0 голосов
/ 27 мая 2009

Очень простое решение следующее. Обратите внимание, что он также будет соответствовать некоторым недопустимым числовым строкам, таким как $..44,.777.

\$[0-9,.]+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...