我想创建一个正则表达式,它允许您输入Name
和Surname
之类的值。但是我有一些限制:
首字母大写(仅一个),然后其他小写字母
在上一个之后,用户可以使用'
,-
或(空格),然后使用与第一点相同的规则
我几乎达到了目的,但是仍然无法正常工作。这是我的创作:
/^[A-ZÀ-ž]{1}[a-zà-ž]+[\s\'-]{0,1}(?:(?=[\s\'-]{0,1})[A-ZÀ-ž]{1}[a-zà-ž]+|(?=[\s\'-]{0,1})[a-zà-ž]+)$/i
我想在Javascript中使用
.test(value)
函数。不幸的是,它也接受这些:Test
Test -
Test-
test
Test
Test-test
TTest
Test'test
我要接受和允许的是:
Test
Test-Test
Test Test
Test'Test
我不知道我在做什么错以及如何解决此问题……我在这里缺少什么?
最佳答案
您需要分别匹配大小写字母。当前,您的欧洲字母的À-ž
范围包括所有大小写字母,甚至包括一些非字母。
这是您需要的范围:
大写(基本欧洲)
基本拉丁语—大写拉丁字母:[A-Z]
拉丁语1增补-字母项目-大写:[À-ÖØ-Þ]
拉丁文扩展A-欧洲拉丁文-大写字母:[ĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJijĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒœŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽ]
小写(基本欧洲)
基本拉丁语—小写拉丁字母:[a-z]
拉丁文1补编-字母项目-小写:[ß-öø-ÿ]
拉丁文扩展A-欧洲拉丁文-小写字母:[žſāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľŀłńņňŋōŏőŕŗřśŝşšţťŧũūŭůűųŵŷźż]
您需要的模式是
/^[UPPER][lower]+(?:[\s'-][UPPER][lower]+)*$/
其中
UPPER
和lower
是大写和小写字母范围/集。因此,让我们构建模式。
var upper = '[A-ZÀ-ÖØ-ÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJijĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒœŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽ]';
var lower = '[a-zß-öø-ÿžſāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľŀłńņňŋōŏőŕŗřśŝşšţťŧũūŭůűųŵŷźż]';
var rx = new RegExp("^" + upper + lower + "+(?:[\\s'-]" + upper + lower + "+)*$");
// Let's test
var tests = ['Test ','Test - ','Test-',' test','Test-test','TTest','Test\'test','Test','Test-Test','Test Test','Test\'Test', 'Łóźćż\'żłóźćęą'];
for (var s of tests) {
console.log(s, '=>', rx.test(s))
}
注意还有更多可以用欧洲语言使用的字母。有关更多详细信息,请参见Unicode Utilities以供参考。
注意2:如果您计划仅支持Chrome和其他ECMAScript 2018兼容浏览器,则可以使用
console.log( // ONLY WORKS IN ECMASCRIPT 2018 COMPATIBLE JS ENVIRONMENTS
/^\p{Lu}\p{Ll}+(?:[\s'-]\p{Lu}\p{Ll}+)*$/u.test("Test'Ťĕśţ")
);
Java定义:
String pattern = "(?U)^\\p{Lu}\\p{Ll}+(?:[\\s'-]\\p{Lu}\\p{Ll}+)*$";
如果在Java
matches()
方法中使用它,请删除^
和$
,因为它们在那里多余。