Отфильтруйте числа из текста, используя регулярные выражения в JavaScript - PullRequest
9 голосов
/ 23 июня 2010

Как лучше всего использовать регулярные выражения javascript для получения чисел из текста? например ... У меня есть "$ 4320 текст / подписка", и я хочу получить 4320 из этого. Однако я хочу избежать чисел после первого появления алфавита или любого другого алфавита, кроме запятой ','

так что если у меня будет $ 4320 t234ext / followme, он все равно вернет мне 4320. На входе всегда будет знак $ в начале

поэтому регулярное выражение должно возвращать

 $4,320 text/followme          returns  4320
 $4,320 t3444ext/followme      return   4320
 $4,320 /followme              return   4320
 $4320 text/followme           return   4320
 $4320 t3444ext/followme       return   4320
 $4320 /follow4me              return   4320

Ответы [ 4 ]

16 голосов
/ 23 июня 2010
string.split(/ /)[0].replace(/[^\d]/g, '')
5 голосов
/ 23 июня 2010

Самое простое регулярное выражение, которое вы возможно ищете, это \D (любой символ, который не является цифрой. Есть несколько таких "отрицательных" выражений - \d соответствует цифре, \D соответствует нечисловым значениям. \w соответствует символам "слова" (буквенно-цифровым и подчеркиванию), \W соответствует нечисловым значениям. \s соответствует пробельным символам, \S соответствует непробельным символам).

Итак:

str = '$4,320 text/folowme';
number = str.replace(/\D/g,'');

должно выдать '4320' внутри числа. «Г» важно. Он говорит: глобальный поиск / замена всех экземпляров этого регулярного выражения. Без этого вы просто потеряете знак доллара. :)

Обратите внимание, что если у вас есть отрицательные числа или рациональные числа (которые могут иметь два нецифровых символа в их представлении, '-' и '.'), Ваша проблема становится немного сложнее. Вы можете сделать что-то вроде:

number = str.replace(/[^-.0-9]/g,'');

Это будет работать до тех пор, пока ваши числа будут правильно сформированы, поскольку никто не делает ничего сумасшедшего, например «4-5.0-9aaaa4z.2».

Чтобы быть в безопасности, вы можете запустить этот список через parseInt или parseFloat:

number = parseFloat(str.replace(/[^-.0-9]/g,''));

UPDATE

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

number = parseFloat(str.replace(/[^-.0-9\s]/g,''));

и лишние цифры будут просто отлично.

ОБНОВЛЕНИЕ 2

Подумав немного об этом, использование parseFloat означает, что вам не нужно вычеркивать все - только все нечисловые символы до нужного вам числа и запятые. Таким образом, мы можем разбить это на два более простых регулярных выражения (и, возможно, быстрее, тем более, что один из них не является глобальным). И тогда parseFloat отбросит завершающий нецифровый ввод для вас.

number = parseFloat(str.replace(/,/g,'').replace(/^[^-0-9]*/,''));
0 голосов
/ 23 июня 2010

Вот немного более сложное регулярное выражение.

2-я строка: проверяется начальный символ '$' и допускается любая комбинация цифр (0-9) и запятых после этого.

3-я строка: удаляет начальные $ и любые запятые в числовом значении.

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

var str="$4,320 t3444ext/followme";
var regex = /^\$([0-9,])*/g;
var matchedNum = str.match(regex)[0].replace(/[\$,]/g, '');
0 голосов
/ 23 июня 2010
function parseNumber(input) {
    var r = "", i = 0, c = "", s = input + " ";
    if (s.charAt(0) === "$") {
        i++;
    } 
    while (i < s.length) {        
        c = s.charAt(i++);
        if (c < "0" || c > "9") {
            if (c === ",") {
                continue;
            }
            break;
        }
        r += c;
    }
    return r;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...