繁体   English   中英

具有非捕获组的Javascript正则表达式是两种选择

[英]Javascript regex with non-capturing group as two alternatives

我想创建一个正则表达式,使您可以输入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

我不知道我在做什么错以及如何解决此问题……我在这里缺少什么?

您的正则表达式在某些地方“太冗长”,例如:

  • 根本不需要{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]
  • 拉丁语1补充资料-字母项目-大写: [À-ÖØ-Þ]
  • 拉丁文扩展A-欧洲拉丁文-大写字母: [ĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJijĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒœŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽ]

小写(基本欧洲)

  • 基本拉丁语—小写拉丁字母: [az]
  • 拉丁语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实用程序以供参考。

注意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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM