Nodejs эквивалент c sscanf

Мне нужна функция, которая ведет себя аналогично поведению sscanf

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

"This is normal text that has to exactly match, but here is a ${var}"

И вернуть/изменить переменную, чтобы она выглядела как

{'var': <whatever was there>}

После некоторого исследования я смог найти только scanf, но это принимает форму ввода stdin, а не строку.

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

Вы пробовали использовать функцию prompt()?

Danizavtz 24.12.2020 03:08

@Danizavtz Кажется, он принимает только ввод из командной строки

Ruiqi Li 24.12.2020 03:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
466
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы хотите, чтобы ${var} выступал в качестве заполнителя? Если это так, вы можете сделать это, заменив " обратной галочкой:

console.info(`This is normal text that has to exactly match, but here is a ${"whatever was there"}`)

Я не уверен, что вы понимаете, что на самом деле делает sscanf. Он принимает строку и еще одну строку и анализирует ее в соответствии со строкой формата. Я хочу что-то похожее на это, но вместо создания этой строки наоборот

Ruiqi Li 24.12.2020 02:55

О, хорошо, извините, я неправильно истолковал ваш вопрос.

Jarrett 24.12.2020 02:58
Ответ принят как подходящий

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

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

В любом случае. Нормальное решение для этого string.prototype.match:

let text = get_string_to_scan();

let match = text.match(/This is normal text that has to exactly match, but here is a (.+)/);

if (match) { // match is null if no match is found
    // The result you want is in match[1]
    console.info('value of var is:', match[1]);
}

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

Если вы просто хотите захватить «слово», то есть печатные символы без пробелов, вы можете использовать (\w+):

text.match(/This is normal text that has to exactly match, but here is a (\w+)/)

Если вы хотите записать слово только с буквами, но без цифр, вы можете использовать ([a-zA-Z]+):

text.match(/This is normal text that has to exactly match, but here is a ([a-zA-Z]+)/)

Именно из-за гибкости регулярных выражений другие методы сканирования строк обычно не поддерживаются в языках, в которых с самого начала были встроены регулярные выражения. Но, конечно, гибкость приходит со сложностью.

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

Ruiqi Li 24.12.2020 16:54

Большинство современных библиотек регулярных выражений фактически сканируют большие строки быстрее, чем простое сканирование (таким образом, простая реализация scanf). Это связано с тем, что большинство движков регулярных выражений используют алгоритм Бойера-Мура для буквального поиска с середины 80-х или начала 90-х годов. Конечно, вы также можете реализовать scanf с Бойером-Муром, но я не знаю, есть ли они. Я знаю, что С++ по умолчанию выполняет поиск строк медленнее, чем современные механизмы регулярных выражений, потому что С++ позволяет вам выбрать алгоритм Бойера-Мура в качестве альтернативного алгоритма для поиска строк. Альтернатива, не по умолчанию.

slebetman 24.12.2020 17:48

Другие вопросы по теме