我需要在西里尔字符串中找到一些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ЕСТ ТЕСТ"
但它取代了部分单词,我不需要替换部分单词。
答案 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))
));