我一直试图想出一个正则表达式,它将替换一个可能包含或不包含重音字符的单词。我过去几天一直在研究这个问题,但找不到解决问题所需的信息。
我想出了一个简单的正则表达式来处理没有重音字符的单词:
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
有任何建议吗?
答案 0 :(得分:2)
答案有点复杂,但在下面已经回答了为什么你在这个问题上挣扎:Why can't I use accented characters next to a word boundary?
然而,由于Javascript缺乏良好的unicode支持,特别是在ECMAScript 6之前(过去我自己也有这个问题)。我发现使用具有更好unicode支持的第三方库通常会更好,例如:http://xregexp.com/
这也消除了旧版浏览器支持的一些差异。