我已经研究了Stack Overflow(替换字符。eh,JavaScript如何不遵循有关RegExp的Unicode标准等),还没有真正找到问题的具体答案:
How can JavaScript match for accented characters (those with diacritical marks)?
我正在强制UI中的字段匹配以下格式:(last_name, first_name
最后一个[逗号空间]首先),并且我想提供对变音符号的支持,但是显然在JavaScript中,它比其他语言/平台要难一些。
这是我的原始版本,直到我想添加变音符号支持:
/^[a-zA-Z]+,\s[a-zA-Z]+$/
目前,我正在讨论增加支持的三种方法之一,所有这些方法我都已经过测试和工作(至少在某种程度上,我真的不知道第二种方法的“范围”是什么)。他们来了:
明确列出我希望接受的所有带重音符号的字符(花边和过于复杂):
var accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ";
// Build the full regex
var regex = "^[a-zA-Z" + accentedCharacters + "]+,\\s[a-zA-Z" + accentedCharacters + "]+$";
// Create a RegExp from the string version
regexCompiled = new RegExp(regex);
// regexCompiled = /^[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+,\s[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+$/
- 这样可以正确地将姓氏/名字与中的任何支持的重音字符相匹配
accentedCharacters
。
我的另一种方法是使用.
字符类,使表达式更简单:
var regex = /^.+,\s.+$/;
- 这几乎可以匹配任何东西,至少形式为:
something, something
。我想那没关系...
我刚刚发现的最后一种方法可能更简单...
/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
- 它与一系列unicode字符匹配-经过测试和正常工作,尽管我没有做任何疯狂的事情,但仅仅是我在语言部门中看到的用于教师姓名的普通内容。
这是我的担忧:
- 第一个解决方案太过局限了,草率而又令人费解。如果我忘了一个或两个字符,则需要更改它,但这不是很实际。
- 第二种解决方案更好,更简洁,但是它可能比实际需要的匹配得多。我找不到任何实际的文件究竟是什么
.
比赛,(在从表中“任何除换行符字符”的只是概括MDN)。 第三种解决方案似乎是最精确的,但是有什么陷阱吗?我不是很熟悉的Unicode,在实践中至少,但看着码表 / 该表的延续,
\u00C0-\u017F
似乎是非常稳固,至少在我的预期输入。- 学院不会以其母语(例如阿拉伯语,中文,日语等)提交带有名称的表格,因此我不必担心拉丁字符集字符超出
因此,真正的问题是:这三种方法中哪一种最适合该任务?还是有更好的解决方案?
regex = /^[^,]+,\s[^,]+$/;
来防止这种情况。