Javascript正则表达式替换可能包含重音字符的单词

时间:2016-07-15 15:26:20

标签: javascript regex diacritics non-ascii-characters

我一直试图想出一个正则表达式,它将替换一个可能包含或不包含重音字符的单词。我过去几天一直在研究这个问题,但找不到解决问题所需的信息。

我想出了一个简单的正则表达式来处理没有重音字符的单词:

var re = new RegExp('(?:\\b)hello(?:\\b)', 'gm');
var string = 'hello hello hello world hellos hello';
string.replace(re, "FOO");

结果:FOO FOO FOO world hellos FOO

以上是我想要的。上面代码的问题是,当单词包含重音字符作为字符串中的第一个或最后一个字符时。例如:

var re = new RegExp('(?:\\b)helló(?:\\b)', 'gm');
var string = 'helló helló helló world hellós helló';
string.replace(re, "FOO");

结果:helló helló helló world FOOs helló

期望的结果:FOO FOO FOO world hellós FOO

根据我的理解,上述情况正在发生,因为重音字符被解释为边界。我尝试解决问题(注意:范围[A-zÀ-ÿ]是我认为构造单词的有效字母表):

var re = new RegExp('([^A-zÀ-ÿ]|^)helló([^A-zÀ-ÿ]|$)', 'gm');
var string = 'helló helló helló world hellós helló';
string.replace(re, "$1FOO$2");

结果:FOO helló FOO world hellós FOO

如您所见,我更接近理想的结果。但是,当有问题的单词连续出现三次或更多次时,会出现问题。请注意,第二次出现的helló被忽略了。我相信这是因为它之前的空白已经与helló的第一次出现相匹配。

有人对如何实现FOO FOO FOO world hellós FOO有任何建议吗?

1 个答案:

答案 0 :(得分:2)

答案有点复杂,但在下面已经回答了为什么你在这个问题上挣扎:Why can't I use accented characters next to a word boundary?

然而,由于Javascript缺乏良好的unicode支持,特别是在ECMAScript 6之前(过去我自己也有这个问题)。我发现使用具有更好unicode支持的第三方库通常会更好,例如:http://xregexp.com/

这也消除了旧版浏览器支持的一些差异。