为CA123456SDL或CA123456等模式编写正则表达式

问题描述 投票:1回答:3

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

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}规则,现在确定如何为小写添加相同,任何想法如何实现这一点?

.net regex
3个回答
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次)
  • $ - 字符串的结尾。

0
投票

正则表达式本身将是:[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


0
投票

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

^([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

如果这对您有用,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.