【发布时间】:2016-11-18 21:14:28
【问题描述】:
我一直在尝试提出一个正则表达式来替换可能包含或不包含重音字符的单词。过去几天我一直在研究这个问题,但找不到解决问题所需的信息。
我想出了一个简单的正则表达式,它可以很好地处理没有重音字符的单词:
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
如您所见,我离想要的结果更近了。但是,当相关单词连续出现 3 次或更多次时,就会出现问题。请注意helló 的第二次出现被忽略。我相信这是因为它前面的空格已经与helló 的第一次出现匹配。
有人对如何实现FOO FOO FOO world hellós FOO有任何建议吗?
【问题讨论】:
-
很可能是 stackoverflow.com/questions/5436824/… 的副本,但在确认之前我不会使用锤子
-
你能具体解释一下匹配单词的要求是什么吗?它是否被替换为字符串中任何位置或特定位置的任何实例。那么,为什么不用
helló\B? 而不是那个正则表达式
标签: javascript regex diacritics non-ascii-characters