Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于替换可能包含重音字符的单词的Javascript正则表达式_Javascript_Regex_Diacritics_Non Ascii Characters - Fatal编程技术网

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

用于替换可能包含重音字符的单词的Javascript正则表达式,javascript,regex,diacritics,non-ascii-characters,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 hello

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

我想出了一个简单的正则表达式,它可以处理没有重音字符的单词

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

根据我的理解,出现上述情况是因为重音字符被解释为边界。我试图解决这个问题(注释:范围<代码> [AZ Z -] ] /代码>是我认为构建一个单词的有效字母表:

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

正如你所看到的,我离期望的结果更近了。但是,当所讨论的单词连续出现三次或三次以上时,就会出现问题。请注意,第二次出现的
helló
被忽略。我相信这是因为它前面的空格已经与第一个出现的
helló
匹配


有没有人对如何实现
FOO-FOO-FOO-world hellós-FOO
有什么建议?

答案有点复杂,但下面已经回答了你为什么在这个问题上苦苦挣扎的原因:

然而,考虑到Javascript中缺乏良好的unicode支持,尤其是在ECMAScript 6之前(我自己过去也遇到过这个问题)。我发现使用具有更好unicode支持的第三方库通常更好,例如:


这也消除了旧浏览器在支持方面的一些差异

答案有点复杂,但关于你为什么在这个问题上苦苦挣扎,我们已经在下面给出了答案:

然而,考虑到Javascript中缺乏良好的unicode支持,尤其是在ECMAScript 6之前(我自己过去也遇到过这个问题)。我发现使用具有更好unicode支持的第三方库通常更好,例如:


这也消除了旧浏览器在支持方面的一些差异

很可能是的副本,但在确认之前我不会使用hamer。您能准确解释匹配单词的要求吗?是否在字符串中的任何位置或特定位置替换它。因此,为什么不使用正则表达式而不是
helló\B
?很可能是的副本,但在确认之前我不会使用hamer。您能准确解释匹配单词的要求吗?是否在字符串中的任何位置或特定位置替换它。因此,为什么不使用正则表达式而不是
helló\B
var re = new RegExp('([^A-zÀ-ÿ]|^)helló([^A-zÀ-ÿ]|$)', 'gm');
var string = 'helló helló helló world hellós helló';
string.replace(re, "$1FOO$2");