我想创建一个正则表达式,它允许您输入NameSurname之类的值。但是我有一些限制:


首字母大写(仅一个),然后其他小写字母
在上一个之后,用户可以使用'-(空格),然后使用与第一点相同的规则


我几乎达到了目的,但是仍然无法正常工作。这是我的创作:

/^[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]+)*$/


其中UPPERlower是大写和小写字母范围/集。

因此,让我们构建模式。



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()方法中使用它,请删除^$,因为它们在那里多余。

10-07 23:29