【问题标题】:Regex pattern for validation - trying to condense repetitive patterns in regex用于验证的正则表达式模式 - 尝试在正则表达式中压缩重复模式
【发布时间】:2015-12-31 13:25:26
【问题描述】:

我必须在 C# 中验证“项目代码”字符串 - 字符串长度可以在 5-10 个字符之间。除此以外的唯一规则如下:

  1. 第一个字符只能是字母或数字
  2. 中间字符(如果存在)可以是字母、数字或句点 (.)
  3. 最后一个字符只能是字母或数字
  4. *避免中间连续出现多个句号

我可以像这样验证 5-10 个字符的限制:

^(?=.{5,10}$)

第 1 部分和第 3 部分是这样的:

[a-zA-Z0-9]{1}

中间的规则是这样的:

[a-zA-Z0-9.]{0,8}

如果我把它们放在一起,我有这个:

^(?=.{5,10}$)[a-zA-Z0-9]{1}[a-zA-Z0-9.]{0,8}[a-zA-Z0-9]{1}$

它工作正常,但所有几乎相同的代码,似乎可以以某种方式压缩。有任何想法吗?谢谢!

【问题讨论】:

  • 你想只允许 ASCII 符号吗?
  • 限制比这更进一步——只有英文字母的 26 个字母或数字 0-9
  • 只需添加一个前瞻:(?i)^(?!.*[.]{2})[a-z0-9][a-z0-9.]{3,8}[a-z0-9]$
  • 天哪 - 非常感谢 - 我无法正确理解前瞻的语法。
  • 这也可以:(?i)^(?=.{5,10}$)[a-z0-9]+(?:\.[a-z0-9.]+)*$。前瞻处理所有计数,因此正则表达式的主体只需验证结构(即,每个句点之前和之后都是字母数字,并且没有其他类型的字符)。

标签: c# regex


【解决方案1】:

您可以通过将中间部分匹配 3 到 8 次并与外部部分匹配一次来使其更短(您不需要 {1})。这消除了对代码中 5,10 部分的需求,因为 1+3+1=5 和 1+8+1=10。

^[a-zA-Z0-9][a-zA-Z0-9.]{3,8}[a-zA-Z0-9]$

【讨论】:

  • 哦,对了 - 谢谢!那里有点过度建设;-)
【解决方案2】:

你可以使用

(?i)^(?!.*[.]{2})[a-z0-9][a-z0-9.]{3,8}[a-z0-9]$

demo

  • ^[a-z0-9] - 第一个字符只能是字母或数字
  • [a-z0-9.]{3,8} - 中间字符(如果存在)可以是字母、数字或句点 (.)
  • [a-z0-9]$ - 最后一个字符只能是字母或数字
  • ^(?!.*[.]{2}) - *避免中间连续出现多个句号

(?i) 内联修饰符在与 new Regex() 初始化程序一起使用时可以替换为 RegexOptions.IgnoreCase flag

【讨论】:

    【解决方案3】:

    我要背负西拉尔的回答,所以给他+1! 我正在使用不区分大小写的标志从[a-zA-Z0-9][a-z0-9]

    ^(?i)[a-z0-9][a-z0-9.]{3,8}[a-z0-9]$
    

    谢谢各位!

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 2021-04-20
      • 2019-06-28
      • 2015-05-14
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      相关资源
      最近更新 更多