Допустим, у меня есть этот текст в документе Google: Мой foo не бар, это foobar. Я хочу заменить весь текст foo, bar и foobar в этом документе с помощью скрипта Google Apps. Для этого я использую простой цикл for-in:
const replaceWords = () =>{
for (let key in mark){
body.replaceText(key,marks[key])
}
}
где метки это объект:
const marks = {
"foo": "x",
"bar": "y",
"foobar": "z"
}
Как я могу быть уверен, что такие слова, как foobar, не будут заменены на xy вместо z? Насколько я понимаю, установка ключей с помощью граничного сопоставления "\b", как здесь \\bfoo\\b
, должна гарантировать это, но это усугубило ситуацию.
Пересмотренный сценарий
function replaceMarks() {
var doc = DocumentApp.getActiveDocument()
var body = doc.getBody()
const marks = {
"foo": "x",
"bar": "y",
"foobar": "z"
}
for (const [key, value] of Object.entries(marks)) {
body.replaceText('\\b'+key+'\\b',value)
}
}
Синтаксис для «replaceText» — replaceText(searchPattern, replacement)
. searchPattern
"передается как строка, а не как объект регулярного выражения JavaScript. Из-за этого вам нужно экранировать обратную косую черту в шаблоне".
SearchPattern становится '\\b'+key+'\\b'
\b
— граница слова; поэтому он гарантирует целые слова.До
После
Я не знаю скрипт приложений Google, но с точки зрения регулярных выражений ваша замена должна работать. Что вы имеете в виду под "стало хуже"?