正则表达式允许单词之间的单个空格

时间:2018-06-11 18:26:34

标签: regex string utf-8

这是用户全名的正则表达式,所以我想允许空格。 另外,我使用以下正则表达式仅允许UTF-8字符:

/^(\p{L}+)$/u

然后我在这里看到一条帖子说我需要在角色类中添加空格,但这不起作用:

/^(\p{L} +)$/u

3 个答案:

答案 0 :(得分:4)

根据接受全名和unicode(u)模式的正则表达式,尝试考虑这个正则表达式(兼容标准POSIX正则表达式,包括Python,JS和PHP正则表达式):

  • /^[\p{L}'\-\.]+( [\p{L}'\-\.]+)*$/u

因此,此正则表达式将通过以下方式进行分析:

  • 任何字母字符(包括撇号,连字符和句点):[\p{L}'\-\.]+
  • 每个附加名称包含:
    • 正好一个空格:
    • 后面跟适用的字母字符:[\p{L}'\-\.]+
    • 所有组合在一起,形成( [\p{L}'\-\.]+)*

此正则表达式支持单个和多个单词的名称(也就是用户的全名)。如果要包含更多字符,请通过添加更多字符来修改[\p{L}'\-\.](特别是当需要重音字符时,例如ñ。目前,它包括不同脚本中的字母字符以及撇号和连字符。

它在PHP或JS引擎中接受此类名称,您可以针对其他引擎测试它,显示某些引擎要求您手动添加这些字符或将其更改为\w(可以验证测试{{3} }):

  • Johnny Appleseed
  • Martin Harding-Rolls
  • Daniel O'Brian
  • IJsbrand van 't IJsselstein
  • Euclid
  • Jalapeño Arriba(您可能需要在列表中添加ñ)
  • S.L.IJ.M.B.A.L P.U.I.S.T
  • Paul Erdős(您可能需要在列表中添加匈牙利语重音字母)
  • на русском
  • 李富(中文/ CJK字符构成Unicode中的一个非常大的部分)

目前不接受这些名称:

  •  Spaceman Superman(名称前面的空格)
  • OMG (名字后的空格)
  • Johnny Appleseed(两个空格)
  • -- '+(不可接受的字符)
  • Mulliganaceous2 Shogun(数字,仅限\p{L}
  • Pokemon Porygon2(数字,仅限\p{L}

关于兼容性和\w转义(编辑:提问者特别想要用数字排除名称)

如果\p{L}不起作用,您可以尝试/^[\w'\-\.]+( [\w'\-\.]+)*$/u

  • \w匹配所有ASCII字符,包括数字和下划线:[A-Za-z0-9_]
  • 是否包含重音字符和其他脚本中的字符之间存在不一致
    • 某些正则表达式引擎包含CJK字符,而其他引擎只包含ASCII字符。
    • 如果排除特殊字符,您可能需要手动包含它们。
    • 您还可以包含一系列Unicode字符:
      • 要包含中文字符,请使用[\u4E00-\u9FFF]
    • 交叉点也可用于某些引擎:[\w'\-\.&&[\D]]表示所有单词,撇号,连字符和句点的字符类,但不是数字。

答案 1 :(得分:2)

一种不同的方法,只允许字母之间的单个空格(pcre / php pattern)。

/^(?>\pL+ ?\b)+$/u
  • \pL+匹配一个或多个unicode字母
  • ?单个空格为optional
  • 字边界\b要求quantified group以字母结尾。
  • 与Ruby或.NET等其他正则表达式更兼容:^(?:\p{L}+ ?\b)+$

See demo at regex101 for testing

(此模式要求字符串以字母开头,以字母结尾)

答案 2 :(得分:0)

我认为这个正则表达式可以用于完整的用户名,

/^([a-zA-Z' ]+)$/

我认为你不应该把正则表达式放在一个名字上,因为将全世界所有的名字与外国字符和不同的语言相匹配是一项相当复杂的工作,并没有很多优势。

尝试包含外国字符

/^[a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð ,.']+$/u