[英]Javascript regex with non-capturing group as two alternatives
我想创建一个正则表达式,使您可以输入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
我不知道我在做什么错以及如何解决此问题……我在这里缺少什么?
您的正则表达式在某些地方“太冗长”,例如:
{1}
。 默认重复次数仅为1。 {0,1}
可以写得更短?
。 \\
之前'
是没有必要的。 您还使用了两种情况(?= ... )
- 正向超前 ,这里完全不需要。
Wiktor提出的正则表达式几乎可以,但是我将最后一个*
更改为?
,因为您只提到了一个可选姓(不是很多)。
所以我的主张是:
^[A-ZÀ-Ž][a-zà-ž]+(?:[\s'-][A-ZÀ-Ž][a-zà-ž]+)?$
描述:
^
-源字符串的开头。 [A-ZÀ-Ž]
-大写字母(名称的开头)。 [a-zà-ž]+
-小写字母(其余名称)的序列。 (?:
-一个非捕获组,由于后面加上?
而需要。
[\\s'-]
- [\\s'-]
-白色字符或撇号或减号(名称和姓氏之间的分隔符)。 [A-ZÀ-Ž][a-zà-ž]+
-姓-就像名字一样。 )?
-非捕获组的结尾,可选。 代替?
,维克多(Wiktor)提出*
,允许使用许多姓氏。 $
-源字符串的结尾。 因此,非捕获组将容器设置为:
它是可选的( ?
),因为可能没有姓氏(以及前面的分隔符)。
也许\\s
应该只用一个空格代替,因为\\s
还要与Tab
或'\\n'
匹配,我认为,不应将这些字符用作分隔符。
您需要分别匹配大小写字母。 当前,您的欧洲字母À-ž
范围包括所有大小写字母,甚至包括一些非字母。
这是您需要的范围:
大写(基本欧洲)
[AZ]
[À-ÖØ-Þ]
[ĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJijĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒœŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽ]
小写(基本欧洲)
[az]
[ß-öø-ÿ]
[žſāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľŀłńņňŋōŏőŕŗřśŝşšţťŧũūŭůűųŵŷźż]
您需要的模式是
/^[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实用程序以供参考。
注意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()
方法中使用它,请删除^
和$
因为它们在那里多余。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.