首页 > 解决方案 > 如何编写允许单词之间有一个空格的正则表达式?

问题描述

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

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

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

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

标签: regexstringutf-8

解决方案


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

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

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

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

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

它在 PHP 或 JS 引擎中接受此类名称,您可以对其他引擎进行测试,表明某些引擎需要您手动添加这些字符或将其更改为\w(可以在此处验证测试):

  • 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]]表示所有单词、撇号、连字符和句点的字符类,但不是数字。

推荐阅读