【问题标题】:Writing a regex for a pattern like CA123456SDL or CA123456为 CA123456SDL 或 CA123456 等模式编写正则表达式
【发布时间】:2018-11-27 12:07:25
【问题描述】:

我正在尝试使用规则构建正则表达式:

2 个字母,或无字母后跟最多 6 个数字后跟最多 3 个字母,但不必包含字母

(后缀可以是 F、L、SD 或 SDL)

例如CA123456SDL 或 CA123456 或 123456

这必须接受大小写。

到目前为止,我得到了以下内容:

^([aA-zZ]{2}[0-9]{6,6}[F|L|SDL|SD]{0,1}$)

但它没有应用 [F|L|SDL|SD]{0,1} 规则,现在确定如何为小写添加相同的规则,知道如何实现吗?

【问题讨论】:

  • 试试^(?:[A-Za-z]{2})?[0-9]{6}(?:[Ff]|[Ll]|[Ss][Dd][Ll]?)?$,见demo。你在哪里使用这个模式?什么语言/方法/工具?
  • 语言是什么?
  • 点网语言

标签: .net regex


【解决方案1】:

请注意,[aA-zZ] 等于 [A-z] 模式,它是 does not only match letters[F|L|SDL] 匹配集合中的单个字符:F|LSD,因为它是 character class 而不是 grouping construct。请注意,{6,6} 等于 {6}。我会坚持使用[0-9],就像你的模式一样,在.NET中,\d matches more than just ASCII [0-9]

你可以使用

(?i)^(?:[A-Z]{2})?[0-9]{6}(?:F|L|SDL?)?$

.NET regex demo

详情

  • (?i) - 不区分大小写的修饰符选项
  • ^ - 字符串锚的开始
  • (?:[A-Z]{2})? - 任意两个 ASCII 字母的可选序列(使用 \p{L} 而不是 [A-Z] 来匹配任何 Unicode 字母)
  • [0-9]{6} - 六个 ASCII 数字
  • (?:F|L|SDL?)? - FLSDSDL 的可选出现(1 或 0 次)
  • $ - 字符串结束。

【讨论】:

    【解决方案2】:

    正则表达式本身将是:[a-z]{0,2}[0-9]{6}[SDL]*,带有不区分大小写的修饰符

    $re = '/[a-z]{0,2}[0-9]{6}[SDL]*/mi';
    $str = 'CA123456SDL OR CA123456 OR 123456';
    
    preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
    
    // Print the entire match result
    var_dump($matches);
    

    工作示例:https://regex101.com/r/6WOyrH/1

    【讨论】:

      【解决方案3】:

      你的正则表达式有几个问题,

      ^([aA-zZ]{2}[0-9]{6,6}[F|L|SDL|SD]{0,1}$)
      

      [aA-zZ] 需要更正为[a-zA-Z] [0-9]{6,6} 很好,但可以紧凑地写成\d{6} 我猜你打算把[F|L|SDL|SD]写成(F|L|SDL|SD)

      如果你想让前两个字符在那里或完全丢失,你需要这样写,

      ([a-zA-Z]{2})?
      

      因此您更新的正则表达式应该是这样的,

      ^([a-zA-Z]{2})?\d{6}(F|L|SDL?)?$
      

      Here is a demo

      让我知道这是否适合您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-26
        • 2020-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多