Javascript将单词(不是单词的一部分)替换为西里尔字母

Javascript replace words (not part of word) in cyryllic

本文关键字:单词 替换 一部分 Javascript      更新时间:2023-09-26

我需要在西里尔字符串中找到一些西里尔单词(只有单词,不是另一个单词的一部分)并将它们替换为另一个。但是我找不到解决这个案子的办法。

在英语中行得通:

'Slipknot not NOT'.replace(/'bNot'b/gi, 'TEST') // Slipknot TEST TEST

'целине не НЕ'.replace(/'bНе'b/gi, 'TEST') // still 'целине не НЕ'

我知道"/b"不是西里尔字母。我找到了这个解决方案:

'целине не НЕ'.replace(/'Не(?![A-я])/gi, 'ТЕСТ'); //"целиТЕСТ ТЕСТ ТЕСТ" when I want "целине TЕСТ ТЕСТ"

但是它替换了部分单词,我不需要替换部分单词

JS中的词边界'b不能用于检测Unicode字母的词边界。它可以通过一个捕获组来实现,该捕获组包含匹配字符串开头或任何非单词(非俄语、非拉丁语、非数字、非下划线)字符的交替,并在单词之后,进行反向前瞻性检查,检查该范围是否存在。在替换部分,我们需要使用$1反向引用来恢复单词之前匹配和捕获的文本。

document.write('целине не НЕ'.replace(/(^|[^A-ZА-ЯЁ0-9_])Не(?![A-ZА-ЯЁ0-9_])/gi, '$1ТЕСТ'));

注意Ё不属于[А-Яа-я](甚至不属于[А-я])范围,因此需要单独添加。

在评论中回答你的问题,

'целине не НЕ нетак'.replace(/(^|[^A-ZА-ЯЁ0-9_])Не(?= )/gi, '$1TECT') //"целине TECT TECT нетак"当我应该得到целине ТЕСТТЕСТнетак

这里的问题是,您需要匹配(=消耗)Не之后的空格,但是该空格可能是识别后续匹配的单词边界所必需的。在这种情况下,您可以依靠字符串反转解决方案:

function revStr(str) {
    return str.split('').reverse().join('');
}
var s = 'целине не НЕ нетак';
var repl = 'ТЕСТ';
document.write(
           revStr(
             revStr(s).replace(/ еН(?=$|[^A-ZА-ЯЁ0-9_])/gi, revStr(repl))
           ));