javascript中的utf-8字边界正则表达式

IT技术 javascript regex unicode utf-8 word-boundary
2021-01-22 07:25:12

在 JavaScript 中:

"ab abc cab ab ab".replace(/\bab\b/g, "AB");

正确给我:

"AB abc cab AB AB"

当我使用 utf-8 字符时:

"αβ αβγ γαβ αβ αβ".replace(/\bαβ\b/g, "AB");

字边界运营商似乎没有工作时:

"αβ αβγ γαβ αβ αβ"

有针对这个的解决方法吗?

5个回答

单词边界断言仅在单词字符之前或之后没有另一个单词字符(因此.\b.等于\W\w\w\W时才匹配\w定义为[A-Za-z0-9_]所以\w不匹配希腊字符。因此你不能\b用于这种情况。

你可以做的是使用这个:

"αβ αβγ γαβ αβ αβ".replace(/(^|\s)αβ(?=\s|$)/g, "$1AB")
@cherouvim:不,它会占用单词后面的空间,然后作为下一次查找的开始。所以只看"αβ αβ",第一个匹配将消耗"αβ |αβ"|表示内部指针),最后一部分将不匹配,因为没有前导空格。但由于前瞻断言不消耗字符,第一次匹配后指针的位置将是"αβ| αβ",前导空格保留用于下一次匹配。
2021-03-20 07:25:12
谢谢。前瞻 (?=...) 符号的使用看起来也很有趣。没有它可以做到吗?
2021-03-29 07:25:12
2021-04-04 07:25:12
@R.MartinhoFernandes 请试试我的答案,因为我需要更多的人来满足我自私的需要,但事实证明它会帮助你作为副作用。
2021-04-05 07:25:12
这与词边界不太一样。例如,它不匹配αβ!
2021-04-11 07:25:12

并非所有 Javascript regexp 实现都支持 Unicode 广告,因此您需要对其进行转义

"αβ αβγ γαβ αβ αβ".replace(/\u03b1\u03b2/g, "AB"); // "AB ABγ γAB AB AB"

要映射字符,您可以查看http://htmlhelp.com/reference/html40/entities/symbols.html

当然,这对单词边界问题没有帮助(如其他答案中所述),但至少应该使您能够正确匹配字符

那么为什么不对字符串使用相同的 Unicode 转义呢?
2021-03-13 07:25:12
但是如果正则表达式实现不支持 Unicode,那么\u03b1应该如何解释Unicode 转义序列
2021-03-19 07:25:12
因为一个被解析为字符串,一个被解析为文字 RegExp - 我不确定它是否重要。
2021-04-09 07:25:12

我需要一些可编程的东西来处理标点符号、括号等。

http://jsfiddle.net/AQvyd/

var wordToReplace = '買い手',
    replacementWord = '[[BUYER]]',
    text = 'Mange 買い手 information. The selected Store and Classification will be the default on the สั่งซื้อ.'

function replaceWord(text, wordToReplace, replacementWord) {
    var re = new RegExp('(^|\\s|\\(|\'|"|,|;)' + wordToReplace + '($|\\s|\\)|\\.|\'|"|!|,|;|\\?)', 'gi');
    return text.replace(re, replacementWord);
}

我写了一个 javascript 资源编辑器,所以这就是为什么我找到了这个页面,并且出于必要也回答了它,因为我找不到一个适合 Unicode 的词边界参数化正则表达式。

实际上,我应该使用保留字符中的“\”来转义“wordToReplace”。我必须更新它。
2021-04-11 07:25:12

并非所有与 Javascript 引擎相关的 RegEx 实现都支持 Unicode。

例如微软在 IE 中使用的 JScript 仅限于 ANSI。

当您处理 Unicode 和自然语言单词时,您可能希望比仅使用\b. 有关详细信息和说明,请参阅此答案