#regex #typescript
Вопрос:
lt;lt;EOH bind_port: {[ env "NOMAD_PORT_db" ]} scratch_dir: {[ env "NOMAD_TASK_DIR" ]} node_id: {[ key "node.unique.id" ]} service_key: {[ key "service/my-key" ]} EOH
у меня есть часть кода формы, в которой я принимаю данные, введенные пользователем, как указано выше. Мне нужно сделать одно подтверждение. Пользователь не должен звонить {{ key .... }}
, вместо этого они должны использовать {{ env .... }}
.
{[s ?keys ?". ?"s ?]}
Это регулярное выражение, которое я придумал, оно должно получить хотя бы одно совпадение. На стороне сценария типа, как мне добавить это в свой код. где я могу сделать что-то вроде
- соответствие регулярному выражению
- найдено по крайней мере одно совпадение
- Возврат
- совпадений не найдено
- проходить.
Я попробовал это на стороне кода.
const matches = value.matchAll(new RegExp('{[s ?keys ?". ?"s ?]}', "g")); for (const match of matches) { console.log(match); return createError({ message: "use {[ env .. ]} instead of {[ key .. ]}" }); }
похоже, это не работает
Ответ №1:
Вы можете использовать RegExp#test
и использовать настроенное регулярное выражение, например
/{[s*keys*"[^"]*"s*]}/
Обратите внимание на отсутствие g
флага, и ленивые кванторы заменяются жадными для повышения производительности. s ?
соответствует по крайней мере одному пробелу, но я предполагаю, что пробелы также могут отсутствовать, поэтому я превратил их в s*
(ноль или более пробелов).
Поскольку это регулярное выражение, соответствующее нежелательному шаблону, RegExp#test
результат должен быть отменен !
перед вызовом функции.
Смотрите демонстрацию JavaScript:
const text = `bind_port: {[ env "NOMAD_PORT_db" ]} scratch_dir: {[ env "NOMAD_TASK_DIR" ]} node_id: {[ key "node.unique.id" ]} service_key: {[ key "service/my-key" ]}`; const re = /{[s*keys*"[^"]*"s*]}/; if (!re.test(text)) { console.log("Valid!"); // Return true here if you use it in a function } else { console.log("use {[ env .. ]} instead of {[ key .. ]}"); }