【问题标题】:How to make sure space is preceded and followed by a letter in a regex?如何确保正则表达式中空格前后都有一个字母?
【发布时间】:2021-04-27 17:28:43
【问题描述】:

我正在尝试为一个人名的字符串编写一个正则表达式。这些是以下限制:

  • 最多可以包含 1 个 - 符号(可以是无)
  • 最多可以包含 1 个 ' 符号(可以没有)
  • 不能有两个相邻的空格
  • 空格前必须跟一个字母(a-z 或 A-Z)
  • 字符串最多包含 20 个字符
  • 字符串必须以字母开头(a-z 或 A-Z)

这是我目前的表达方式:

^(?!.*[ ]{2})(?!(.*?-){2})(?!(.*?'){2})([a-zA-Z])([(?<=[a-zA-Z]) (?=[a-zA-Z])][a-zA-Z0-9\-']*){0,19}$

我缺少的是检查以确保空格前后都有一个字母。任何关于如何合并的建议都非常受欢迎。谢谢!

【问题讨论】:

  • 添加一个有效的阳性测试用例并使用regex101.com
  • 可能是这样的^[a-zA-Z](?!.*(['-]).*\1)(?!.* )(?=.{0,19}$)[a-zA-Z0-9'-]*(?:[a-zA-Z] [a-zA-Z][a-zA-Z0-9'-]*)*$regex101.com/r/UPySgp/1
  • 或者后视也允许a b like ^[a-zA-Z](?!.*(['-]).*\1)(?!.* )(?=.{0,19}$)[a-zA-Z0-9'-]*(?:(?&lt;=[a-zA-Z]) [a-zA-Z][a-zA-Z0-9'-]*)*$ regex101.com/r/QKXOw0/1
  • 天哪,谢谢你!它有效 :) 我取出了数字,因为那些是不允许的(也忘了提到那个规则),它是完美的。你也让我写的更好,所以谢谢你!
  • 虽然这可以通过正则表达式来完成,但编写一些代码进行检查可能更清晰、更简单。

标签: java regex


【解决方案1】:

对于这些特定要求,您可以使用:

^[a-zA-Z](?!.*(['-]).*\1)(?!.*  )(?=.{0,19}$)[a-zA-Z0-9'-]*(?: (?<=[a-zA-Z] )[a-zA-Z][a-zA-Z0-9'-]*)*$

模式匹配:

  • ^ 字符串开始
  • [a-zA-Z] 匹配一个字符 a-zA-Z
  • (?!.*(['-]).*\1) 负前瞻,断言不是 2 次 '- 使用带有反向引用 \1 的捕获组来匹配组 1 中捕获的相同内容
  • (?!.* ) 负前瞻,断言不是 2 个空格
  • (?=.{0,19}$) 正向预测断言 0-19 个字符,因为第一个字符已经匹配
  • [a-zA-Z0-9'-]* 可以选择匹配列出的任何不带空格的内容
  • (?:非捕获组
    • (?&lt;=[a-zA-Z] )[a-zA-Z] 匹配一个空格并在其前面声明一个字符 a-zA-Z
    • [a-zA-Z0-9'-]* 可以选择匹配任何列出的字符
  • )*关闭非捕获组并可选择重复
  • $字符串结束

查看regex demo

或者没有数字

^[a-zA-Z](?!.*(['-]).*\1)(?!.*  )(?=.{0,19}$)[a-zA-Z'-]*(?: (?<=[a-zA-Z] )[a-zA-Z][a-zA-Z'-]*)*$

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多