regex 正则表达式匹配最多6位数字,其中数字之间可以包含1个破折号或1个空格?

w8f9ii69  于 2023-05-19  发布在  其他
关注(0)|答案(3)|浏览(186)

我需要帮助:

\d{1,5}(-| )\d{1,5}

这是我正在做的

^([C][A|F|G|J|K|L])( |)(\d{1,6}|\d{1,5}(-| )\d{1,5})$

([C][A|F|G|J|K|L])匹配前2个字符。
( |)匹配可选空格。
\d{1,6}匹配1-6位数字,不带任何破折号或空格。
\d{1,5}(-| )\d{1,5}应该匹配一个2-6位数,其中包括1个破折号或1个空格。
最后一部分我需要帮助,但是如果你知道一个更好的方法来写整个正则表达式,那么它应该只以'C'开头,第二个字符应该只是'A''F''G''J''K''L'。在前2个字符之后,可以有一个' '(空格)字符,后跟1-6位数字。
下面是我想为整个Regex匹配的示例:

CA 123456
CF 1
CK 0467 21
CL 4 2
CG 456-789
CJ 1-23

并且,如果可能(可选),它还应该匹配:

CA546
CJ99-0
CK8 0565

它不应该匹配:

CZ 123456
C 987-123
CA 12345-
CK  12
CJ -456
CL-654
CJ 1234567
qnyhuwrf

qnyhuwrf1#

你可以将正则表达式简化为

^C[AFGJKL] ?(?=(?:\d+[ -]\d+$|\d{1,6}$))[\d -]{1,7}$

并实现您的Desired Results
将字符放入字符集[]中时不需要|,单个字符[C]可以简单地写成C
写入可选字符可以由后跟?的任何字符完成,因此可选空格可以写成?
唯一棘手的部分是如何编写\d{1,5}(-| )\d{1,5},以便它只匹配1到6位数字,或者如果数字之间有一个空格或连字符,那么它应该再匹配一个额外的字符来合并该空格或连字符,以便最大匹配字符变为7而不是6,这就是我将在下面的正则表达式部分解释的地方,

(?=(?:\d+[ -]\d+$|\d{1,6}$))[\d -]{1,7}
  • (?=-正向前查找,以便\d+[ -]\d+$\d{1,6}$中的任一个应该匹配,这实质上是说,要么匹配(\d+[ -]\d+$)一个或多个用空格或连字符分隔的数字,并且再次匹配一个或多个数字,否则仅(\d{1,6}$)匹配1到6个数字
  • [\d -]{1,7}-最后只捕获数字空格和连字符
jyztefdp

jyztefdp2#

您可以使用一个单一的前瞻,以确保没有7个连续的数字。
然后匹配1+数字,然后是匹配空格或-的可选部分,然后再次匹配1+数字。
或者使其更具体,匹配问题中指定的\d{1,5}数字

^C[AFGJKL](?! ?\d{7}) ?\d+(?:[ -]\d+)?$

说明

  • ^字符串开头
  • C按字面匹配
  • [AFGJKL]匹配所列字符之一
  • (?! ?\d{7})负先行,Assert不是后跟7个连续数字的可选空格
  • ?匹配可选空格
  • \d+(?:[ -]\d+)?匹配1+位数字,可选部分匹配空格或-后跟1+位数字
  • $字符串结束

请参见regex demo

yeotifhr

yeotifhr3#

我可能错了,但我认为regex并没有提供定义最大长度的功能,同时限制特定字符的出现。因此,您需要匹配所有可能的情况。

^(C[AFGJKL]) ?(\d{1,6}|\d{1,5}[- ]\d|\d{1,4}[- ]\d{1,2}|\d{1,3}[- ]\d{1,3}|\d{1,2}[- ]\d{1,4}|\d[- ]\d{1,5})$

regex101-link

进一步改进:

  • 为了使匹配器成为可选的,可以使用x?,它使匹配器或之前的组成为可选的
  • 当你想匹配一组字符中的一个字符时,你可以创建一个新的字符类。[asdf]将匹配字母'a',' s','d',' f'中的任何一个。

相关问题