Используя Javascript, я хочу заменить:
This is a test, please complete ____.
с участием:
This is a test, please complete %word%.
Количество подчеркиваний непостоянно, поэтому я не могу просто использовать что-то вроде str.replace('_____', '%word%').
Я пробовал str.replace(/(_)*/g, '%word%'), но ничего не вышло. Какие-либо предложения?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Удалите группу захвата и убедитесь, что _ повторяется с + (хотя бы одно вхождение соответствует как можно большему количеству _):
const str = 'This is a test, please complete ____.';
console.info(
str.replace(/_+/g, '%word%')
);Регулярное выражение
/(_)*/
означает, на простом языке: сопоставить ноль или более знаков подчеркивания, что, конечно, не то, что вы ищете. Это будет соответствовать позиции каждый в строке (кроме позиций в строке между символами подчеркивания).
Я собираюсь предложить немного другой подход к этому. Вместо того, чтобы сохранять предложение в том виде, в котором оно есть сейчас, сохраните что-то вроде этого:
This is the {$1} test, please complete {$2}.
Если вы хотите оказывать это предложение, используйте замену регулярного выражения, чтобы заменить заполнители символами подчеркивания:
var sentence = "This is the {$1} test, please complete {$2}.";
var show = sentence.replace(/\{\$\d+\}/g, "____");
console.info(show);Если вы хотите заменить данный заполнитель, вы также можете использовать целевую замену регулярного выражения. Например, чтобы настроить таргетинг на первый заполнитель, вы можете использовать:
var sentence = "This is the {$1} test, please complete {$2}.";
var show = sentence.replace(/\{\$1\}/g, "first");
console.info(show);Это довольно надежное и масштабируемое решение, более точное, чем простая замена всех подчеркиваний.
Спасибо, проще, чем я думал! Я боялся, что мне придется использовать одно из тех сложных выражений опережения.