模式的正则表达式?

时间:2015-05-27 16:59:35

标签: regex

我需要编写一个具有以下规则的正则表达式:

  • 1到4之间的数字
  • 连字符(只有一个,可以在任何位置发生)
  • 文字长度必须小于或等于6(包括潜在的连字符)
  • 可能以字母或数字结尾,但不是连字符。

一些有效示例是:

  • 1-3411
  • 12-413
  • 123-2A
  • 11-1

这些示例无效

  • 12--11(因为它包含两个连字符)

  • 1-2345(因为它包含5号)

  • 11-2311(因长度超过6)

我写的RegEx是:

^[1-4]-[1-4]{4}|^[1-4]{2}-[1-4]{3}|^[1-4]{3}-[1-4]{2}|^[1-4]{4}-[1-4]

然而,这似乎不起作用,并且它不会处理最终存在单个字符的情况。

有些人可以帮我确定处理方法吗?

<> 字符出现在最后一个位置然后在字符之前我们必须有一个数字而不是炒作。

即11-a(必须失败)     11-1a(必须通过)

2 个答案:

答案 0 :(得分:3)

^(?!(?:[^-\n]*-){2})(?:[1-4-]{1,5}[1-4]|[1-4-]{1,5}[a-zA-Z])$

您可以使用lookahead处理该问题。请参阅演示。

https://regex101.com/r/tS1hW2/16

答案 1 :(得分:1)

如果您有这么复杂的要求,那么使用lookarrounds来形成and - 同时匹配每个条件的模式总是 easy 。有时你需要将一个条件分成两个:

  • 基本匹配:6位或更少位数:^.{1,6}$
  • (AND)仅1-4和连字符和字母:^[1-4a-z\-]+$(不准确,需要下一行)
  • (AND)First 1 ... 5 elements NO Letter:^[1-4\-]{1,5}[1-4a-z]$
  • (AND)没有双重宣传而不是最后:^[^-]*-[^-]+$

将所有内容放在一起导致:

(?=^[1-4\-]{1,5}[1-4a-z]$)(?=^[^-]*-[^-]*$)(?=^[1-4a-z\-]+$)^.{1,6}$

Regular expression visualization

Debuggex Demo