2016-07-15 153 views
0

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

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

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

很可能是http://stackoverflow.com/questions/5436824/matching-accented-characters-with-javascript-regexes的副本,但我没有使用哈默直到确认 – mplungjan

+0

您能否准确解释需求是什么匹配这个词?它是否替换为字符串内或特定位置的任何实例?所以,而不是那个正则表达式为什么不''helló\ B'? – 10100111001

回答

2

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

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

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