Как вытащить число из строки в JavaScript? - PullRequest
6 голосов
/ 15 июля 2009

Я хочу вытащить число из середины строки в JavaScript . В Ruby (мой основной язык) я бы сделал это:

Ruby:

name = "users[107][teacher_type]"

num = name.scan(/\d+/).first

Но в JavaScript я должен сделать это, что кажется немного неуклюжим.

JavaScript:

var name = "users[107][teacher_type]"

var regexp = new RegExp(/\d+/)

var num = regexp.exec(name)[0]

Есть ли способ вытащить соответствующие части, не создавая объект RegExp? То есть однострочный эквивалент строкового сканирования Ruby?

Также, как примечание, поскольку эта строка всегда будет иметь одинаковый формат, я мог бы сделать это с помощью .replace. Это не такое умное решение, но опять же у меня проблемы с JavaScript.

в рубине:

num = name.gsub(/users\[|\]\[teacher_type\]/,"")

Но когда я пытаюсь сделать это в JavaScript, ему не нравится или (|) в середине регулярного выражения:

В JavaScript:

//works

num = name.replace(/users\[/, "").replace(/\]\[teacher_type\]/,"")

//doesn't work

num = name.gsub(/users\[|\]\[teacher_type\]/,"")

Кто-нибудь может меня поправить?

Ответы [ 6 ]

7 голосов
/ 15 июля 2009

Вам необходимо использовать только часть new RegExp() при создании динамических регулярных выражений. Вы можете использовать литералы в другое время. / \ d + / является эквивалентом new RegExp("\\d+"). Обратите внимание, что вы должны экранировать специальные символы при использовании последних.

Также примечательно, что String#match возвращает ноль или массив. Это не очевидно в зависимости от поставляемых решений (parseInt(name.match(/\d+/), 10)). Так уж получилось, что он передается в parseInt в строку. ParseInt преобразует строковые значения в целые числа (когда это возможно).

name.match(/\d+/)[0]
/\d+/.exec(name)[0]

Эти два функционально идентичны в этом случае.

Другое совпадение, на которое вы ссылались (отрицательное совпадение), требует специального флага. Чтобы дублировать функциональность gsub, нужно указать, чтобы регулярное выражение применялось несколько раз с флагом g.

'users[107][teacher_type]'.replace(/users\[|\]\[teacher_type\]/g,'')

Или, если бы вам пришлось по какой-то причине использовать new RegExp, вы бы выполнили то же, что и выше, например:

'users [107] [teacher_type]'. Replace (новый RegExp ('users \ [| \] \ [teacher_type \]', 'g'), '')

Еще раз обратите внимание, как мне пришлось избежать всех обратных ударов. Центр разработчиков Mozilla - это хороший справочник , чтобы познакомиться с регулярными выражениями в javascript.

3 голосов
/ 15 июля 2009
var num = name.replace(/\D+/, '');

Имейте в виду, что эта однострочная строка не проверяет формат имени. Он просто удаляет все не-цифры (\D противоположно \d).

2 голосов
/ 15 июля 2009

Вы также можете указать основание для числа, используя parseInt(string, radix)

var num = parseInt(name.match(/\d+/), 10);
1 голос
/ 15 июля 2009

Вам не нужно использовать RegExp «конструктор», если вы не строите шаблон на лету (обычно через конкатенацию строк). Литералы шаблона действительны (фактически, вы разместили один в своем фрагменте, когда RegExp () фактически предпочитает строку)

/\d+/.exec( name )[0]

совершенно верно.

Что касается второй части вашего вопроса, я думаю, у вас просто опечатка. Вместо replace у вас все еще есть gsub, который является методом Ruby, а не JavaScript. Сам шаблон должен работать просто отлично.

1 голос
/ 15 июля 2009

В JavaScript это так же просто, как в Ruby (или даже проще):

var num = name.match(/\d+/);
0 голосов
/ 01 февраля 2017

Лично я считаю, что это лучшее.

function parseNumber (n) {
  return Number(n.replace(/[^0-9\.-]+/g,""))
}

// Examples
parseNumber('4')        // 4
parseNumber('4.00')     // 4
parseNumber('$4.1s2')   // 4.12
parseNumber('')         // 0
parseNumber(' ')        // 0
parseNumber('$4.1s2.0') // NaN

Я также имею дело со значением входов, поэтому я сделал такую ​​функцию:

function parseNum(n) {
  // strip all whitespace before and after
  n = String(n).trim()
  // if number is '' or ' ' return empty string
  if (!n) return ''
  // remove everything except numbers and '.'
  return n.replace(/[^0-9\.]+/g,"")
}

// Examples
parseNum('ss10ss')    // 10
parseNum('ss1ss0ss')  // 10
parseNum('2.00')      // 2.00
parseNum('$2.12')     // 2.12
parseNum('$2.s0s0ss') // 2.00
parseNum('')          // ""
parseNum(' ')         // ""
parseNum(4)           // 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...