javascript - 为什么我不能在单词边界旁边使用重音字符?

标签 javascript regex unicode replace diacritics

我正在尝试制作一个与人名匹配的动态正则表达式。它适用于大多数名称,直到我在名称末尾遇到重音字符。

示例:一些花哨的名字

到目前为止我使用的正则表达式是:

/\b(Fancy Namé|Namé)\b/i

这样使用:

"Goal: Some Fancy Namé. Awesome.".replace(/\b(Fancy Namé|Namé)\b/i, '<a href="#">$1</a>');

这根本不匹配。如果我用 e 替换 é,它匹配得很好。 如果我尝试匹配诸如“Some Fancy Naméa”之类的名称,它就可以正常工作。 如果我删除单词 last word 边界 anchor ,它就可以正常工作。

为什么边界标志这个词在这里不起作用?关于如何解决这个问题有什么建议吗?

我考虑过使用这样的东西,但我不确定性能损失会是怎样的:

"Some fancy namé. Allow me to ellaborate.".replace(/([\s.,!?])(fancy namé|namé)([\s.,!?]|$)/g, '$1<a href="#">$2</a>$3')

建议?想法?

最佳答案

JavaScript 的正则表达式实现不支持 Unicode。它只知道标准低字节 ASCII 中的“单词字符”,不包括 é 或任何其他重音或非英语字母。

因为 é 不是 JS 的单词字符,所以 é 后跟空格永远不能被认为是单词边界。 (如果用在单词中间,它将匹配 \b,例如 Namés。)

/([\s.,!?])(fancy namé|namé)([\s.,!?]|$)/

是的,这将是 JS 的通常解决方法(尽管可能有更多的标点符号)。对于其他语言,您通常会使用前瞻/后视来避免匹配前后边界字符,但这些在 JS 中支持不佳/存在错误,因此最好避免。

关于javascript - 为什么我不能在单词边界旁边使用重音字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2449779/

相关文章:

regex - 否定正则表达式中的特定组

javascript - 在网页上进行文本替换的最简洁方法? (使用 GreaseMonkey)

regex - "If"内的 VBA 动态正则表达式模式

android - 如何将带有 Unicode 字符的字符串转换为普通字符串?

html - Unicode 表情符号的颜色

javascript - 嵌套 ng-repeats 中的 AngularJS 过滤器

javascript - 如何在没有 HTML 页面的情况下启动 AngularJS 模块

javascript - 从html中获取内容

java - 在 Java 中打印数学符号给出错误的输出

javascript - 如何从 jQuery 选择器生成的集合中提取数据?