Как лучше разобрать строку и получить нужный параметр

Я пишу веб-приложение. Я получаю информацию в виде строки на уровне пользовательского интерфейса, используя серверный API. Такой ответ со стороны сервера представляет собой одну строку. Структура этих строк следующая:

Ответ ({numberParam} баллов)

Это всегда постоянно. Примеры получения строк:

Response (76 points)

Response (5193 points)

Response (4 points)

Response (21 points)

Мне нужно получить только значение этого числового параметра из строки получения.

Я не должен использовать какие-либо внешние библиотеки и фреймворки. Только нативный JavaScript.

Буду благодарен за любой совет!


person Alex    schedule 21.02.2013    source источник


Ответы (2)


Я бы использовал регулярные выражения, которые идеально подходят для сопоставления таких шаблонов. Вот регулярное выражение, используемое для разделения входной строки на части, разделенные одним или несколькими нецифровыми символами (\D+), чтобы результирующий массив выглядел как ['','76',''], и вы могли выбрать позицию 1 ([1]) из этого массива.

var str = "Response (76 points)"

var num = str.split(/\D+/)[1]
console.log(num)

В качестве альтернативы вы можете заменить все нечисловые символы ничем...

var num = str.replace(/\D/g,'')
console.log(num)

Или сопоставьте первую цепочку числовых символов...

var num = str.match(/\d+/)[0]
console.log(num)

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

var parts = str.split(/\W+/)
// parts is: [ 'Response', '76', 'points', '' ]
var num = parts[1]
console.log(num)
person Billy Moon    schedule 21.02.2013
comment
У вас было решение. Почему вы почувствовали необходимость скопировать вставку из моего ответа? - person Denys Séguret; 21.02.2013
comment
@dystroy Нет, я печатал своими пальцами. Я ответил изначально перед вами, с очень похожей концепцией. Ваш ответ сосредоточен на эффективности и обработке совпадающего числа. Мой фокусируется на регулярном выражении и на том, как его можно использовать по-разному. Я пытаюсь рассказать о силе и универсальности регулярных выражений, так как чувствую, что это может помочь Алексу решить эту и другие подобные проблемы. - person Billy Moon; 21.02.2013
comment
@Билли Спасибо за ответ! Это здорово! - person Alex; 21.02.2013

Если ваша строка всегда такая, вы можете просто сделать

var num = parseInt(str.match(/\d+/)[0], 10);
person Denys Séguret    schedule 21.02.2013
comment
@mplungjan Да, я знаю, но синтаксический анализ строкового представления массива кажется хакерским. Это не яснее и, вероятно, (незначительно) медленнее. ,10 также, вероятно, можно удалить, но это безопаснее. - person Denys Séguret; 21.02.2013
comment
На всякий случай: parseInt(str.match(/\d+/) || [], 10). - person VisioN; 21.02.2013
comment
Чтобы не быть в безопасности : parseInt(str.match(/\d+/)) :) - person Denys Séguret; 21.02.2013
comment
Простите, а с какой целью вызывать метод parseInt()? Могу ли я использовать только domainCountry.match(/\d+/)[0]? Насколько плохо? Это работает правильно. - person Alex; 21.02.2013
comment
parseInt дает вам значение в виде числа. Если вам достаточно строки, не анализируйте ее. - person Denys Séguret; 21.02.2013