在 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);
}
}
}
测试输出:
它可以很好地处理位于行首或行尾(或两者)的单词。而且它没有给出奇怪的错误消息。
问题是 \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);
}
}
}
测试输出:
它可以很好地处理位于行首或行尾(或两者)的单词。而且它没有给出奇怪的错误消息。