正则表达式的车牌

时间:2019-07-05 18:25:26

标签: regex

我必须使用RegEx验证以下类型的表达式的文本值:(必须是8个字符,带有2个连字符和6个字母数字字符。)

  1. aa-99-99
  2. 99-23-bd
  3. 02-xx-04
  4. ab-99-cz
  5. sc-xd-49
  6. 99-xav-4
  7. 48-xyz-09
  8. 9-abc-01
  9. xs-899-x
  10. sss-99-x

我尝试了以下正则表达式模式,但没有用:

/^(\d{1,3})-(\d{1,3})-(\d{1,3})$/

3 个答案:

答案 0 :(得分:3)

在OP澄清后进行更新:

如果您只想在每个块中使用字母或数字,则可以使用:

^(?=.{8}$)(?:(?:[a-z]+|[0-9]+)(?:-|$)){3}

Demo

如果您还想确保字符串同时包含字母和数字,则可以改用以下内容:

^(?=.{8}$)(?=.*[a-z])(?=.*[0-9])(?:(?:[a-z]+|[0-9]+)(?:-|$)){3}

Demo


原始答案:

如果我正确理解了您的要求,则可以使用以下方式:

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

Demo

故障:

^             # The beginning of the string.
(?=.{8}$)     # A positive Lookahead to limit the length of the string to exactly 8 chars.
[a-z0-9]{1,3} # One to three alphanumeric (English) characters.
-             # Matches the character "-" literally.
$             # The end of the string.

更新

如果您想避免重复[a-z0-9]{1,3}部分,则可以使用以下内容:

^(?=.{8}$)(?:[a-z0-9]{1,3}(?:-|$)){3}

...但是该模式不太容易阅读,所以我会坚持使用第一个模式。


参考:

答案 1 :(得分:3)

尝试使用带有m标志的以下正则表达式:

^(?=.{8}$)[^\W_]+(?:-[^\W_]+)+$

如果您需要强制使用数字和字母的组合,请使用以下命令:

^(?=.{8}$)(?![\d-]+$|[a-z-]+$)[^\W_]+(?:-[^\W_]+)+$

请参见live demo here

答案 2 :(得分:0)

查看所有注释,也许您可​​以使用另一个断言来确保字符a-z和数字永远不会相邻。

对于最小值和最大值,您可以使用诸如{1,3}{1,2}的量词

^(?=.{8}$)(?![-\d]+$)(?![-a-z]+$)(?![-a-z\d]*(?:\d[a-z]|[a-z]\d))[a-z\d]{1,3}+-[a-z\d]{1,3}-[a-z0-9]{1,2}$

说明

  • ^字符串的开头
  • (?=.{8}$)前瞻,断言8个字符,后跟字符串的结尾
  • (?![-\d]+$)负向查找,不仅要声明连字符和数字。
  • (?![-a-z]+$)负前行,不仅断言连字符和字符a-z
  • (?!负向前进,断言右边的不是
    • [-a-z\d]*匹配0次以上- a-z或数字
    • (?:非捕获组
      • \d[a-z]|[a-z]\d匹配后跟a-z的数字或相反的方式
    • )关闭非捕获组
  • )近距离否定预测
  • [a-z\d]{1,3}+-[a-z\d]{1,3}-[a-z0-9]{1,2}使用quantifiers匹配a-z或由连字符分隔的数字
  • $字符串结尾

Regex demo