我正在尝试制作一个与人名匹配的动态正则表达式。它适用于大多数名称,直到我在名称末尾遇到重音字符。
示例:一些花哨的名字
到目前为止我使用的正则表达式是:
/\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/