【发布时间】:2019-02-27 01:23:49
【问题描述】:
我知道 JavaScript 的 RegEx 只支持 ASCII 字符串上的 \b 字边界类。但是我可以做些什么来使它与 UTF-8 字符一起工作?
我已经在 stackoverflow 上阅读了几篇关于它的帖子,并尝试了一些方法,例如 here 描述的方法。
但我仍然无法让它工作。
我有一个页面询问用户的姓名。
在文本框中输入后,将显示回复,使用文本框中的部分值问候用户,而忽略其他部分。
如果用户输入“我的名字是约翰”,回复将是“你好,约翰!很高兴认识你!”。
这在英语中可以正常工作,但该页面将使用几种不同的语言,这些语言使用诸如 é á ó ã ñ 之类的字符...当这些字符不是名称的一部分时,如何让它忽略它们?
这是我正在使用的:
function myFunction() {
var text;
var answer = document.getElementById("myInput").value.toLowerCase();
answer = answer.replace(/[^a-z0-9çéã\s]/g, "");
answer = answer.replace(/\b(my|name|is|)\b/g, '').trim();
switch(answer) {
case "":
text = "Please type something.";
break;
default:
text = "Hello, " + answer + "! Nice to meet you!";
}
document.getElementById("reply").innerHTML = text;
}
<p>What is your name?</p>
<input id="myInput" type="text">
<button onclick="myFunction()">Go</button>
<p id="reply"></p>
我试过.replace(/á|é|ó|\b(my|name|is)\b/g, '')
但是,当它们是单词/名称的一部分而不是当它们被用作单个单词时(这是我想要的),这会删除这些字符。
按照该链接上的示例,我也尝试了:
answer = answer.replace(/(^|[ \n\r\t.,'"+!?-]+)(é|á|ó|ñ|õ|hello|my|name|is)([ \n\r\t.,'"\+!?-]+|$)/g, '$1$3').trim();
但它仍然无法按预期工作......
我该如何解决这个问题?
【问题讨论】:
-
这可能不是您期望的答案,但是:您是否打算在 URL 中使用该名称? (虽然有一种在 URL 中使用变音符号的方法)如果没有,我必须告诉你,我不喜欢没有变音符号的名字。但是,有一种方法可以验证小写变音符号。我正在使用
[a-z\xC0-\xff]或[a-z\u00C0-\u017F] -
我不打算在 URL 中使用该名称。至于你的其余回复......我对此很陌生,我还不太了解。我可以在我的代码中更改哪些内容以使其正常工作?
-
您使用的是 ECMAScript 2018 兼容环境吗?你可以使用
/(?<!\p{L}\p{M}*)([áéó]|my|name|is)(?!\p{L})/gu -
或者,模拟
\b:/(?<![\p{L}\p{N}_])([áéó]|my|name|is)(?![\p{L}\p{N}_])/gu -
旁注(因为您说“UTF-8 字符”):JavaScript 使用 UTF-16,而不是 UTF-8。两者都是整个 Unicode 字符集的字符编码。有时需要了解
Sting是一系列 UTF-16 代码单元,并且某些 Unicode 字符需要多个 UTF-16 代码单元。
标签: javascript regex utf-8 word-boundaries