【问题标题】:Javascript regex to replace word that may contain accent charactersJavascript正则表达式替换可能包含重音字符的单词
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多