在 google 个脚本中查找和更改带边界的西里尔字母

Find and change cyrillic word with boundary in google scripts

问题是 \b 不适用于俄语和乌克兰语字母。

在这里,我尝试在文本中找到单词“февраля”的所有匹配项,将它们更改为临时词,然后将其设为 link 并将其更改回“февраля”。

function addLinks(word, siteurl) {
  var id = 'doc\'s ID';
  var doc = DocumentApp.openById(id);
  var body = doc.getBody();
  var tempword = 'ASDFDSGDDKDSL2';
  var searchText = "\b"+word+"\b";
  var element = body.findText(searchText);
  console.log(element);
  while (element) {
    var start = element.getStartOffset();
    var text = element.getElement().asText();
    text.replaceText(searchText, tempword);
    text.setLinkUrl(start, start + tempword.length - 1, siteurl);
    element = body.findText(searchText);
  }
  body.replaceText(tempword, word);
}

addLinks('февраля', 'example.com');

如果我将俄语单词“февраля”更改为英语,它会正常工作 'february'。

addLinks('february', 'example.com');

我需要正则表达式,因为如果我只查找“февраля”,脚本会将其应用于其他词,例如“февралям”、“февралями”等。 所以,这是一个问题,如何让它发挥作用。 此代码出现错误“异常:无效的正则表达式模式”:

var searchText = "(?<=[\s,.:;\"']|^)"+word+"(?=[\s,.:;\"']|$)";

或者这个:

var searchText = "(^|\s)"+word+"(?=\s|$)";

和其他一些。

这是我的解决方案:

function main() {
  addLinks('февраля', 'example.com');
}

function addLinks(word, url) {
  var doc   = DocumentApp.getActiveDocument();
  var pgfs  = doc.getParagraphs();
  var bound = '[^А-яЁё]'; // any letter except Russian one

  var patterns = [
    {regex: bound + word + bound, start: 1, end: 1}, // word inside of line
    {regex: '^'   + word + bound, start: 0, end: 1}, // word at the start
    {regex: bound + word + '$',   start: 1, end: 0}, // word at the end
    {regex: '^'   + word + '$',   start: 0, end: 0}  // word = line
  ];

  for (var pgf of pgfs) for (var pattern of patterns) {
    var location = pgf.findText(pattern.regex);
    while (location) {
      var start = location.getStartOffset() + pattern.start;
      var end   = location.getEndOffsetInclusive() - pattern.end;
      pgf.editAsText().setLinkUrl(start, end, url);
      location = pgf.findText(pattern.regex, location);
    }
  }
}

测试输出:

它可以很好地处理位于行首或行尾(或两者)的单词。而且它没有给出奇怪的错误消息。