Javascript替换cyryllic中的单词(不是单词的一部分)

时间:2015-10-21 07:09:51

标签: javascript regex

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

英语有效:

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

但不是在cyryllic字符串中:

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

我知道" / b"不适合西里尔文。 我找到了这个解决方案:

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

但它取代了部分单词,我不需要替换部分单词。

1 个答案:

答案 0 :(得分:1)

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))
           ));