具有分隔符和长度的正则表达式

时间:2011-12-14 15:03:46

标签: regex

我有一个棘手的正则表达式,我需要实现,我不是一个伟大的RegEx家伙。

规则是:

2个字母数字字符,后跟.-,后跟2个字母数字字符。

它不能为空且不能只有一对(即01)该字符串最多可包含10组2个字母数字。即,01.02.03.04.05.06.10和分隔符一旦被选中,就不能改变。并且表达式不能以分隔符

结束

例如:

有效:

a1.02.b3.00
01-02-aa-04
01.02
aa.bb
ac.21

无效:

aa.01-02
123.2.10
01
a1.

想法?

5 个答案:

答案 0 :(得分:3)

EY,GUYS!?

为什么让事情变得比以前更复杂?

^[a-z0-9]{2}([.-])([a-z0-9]{2}\1){0,8}[a-z0-9]{2}$

根据您使用此正则表达式的位置,您可以选择一些与大写字符匹配的选项。


如果您将正则表达式编写为/regular-expression/:使用/i作为修饰符(不区分大小写的匹配项)。

如果您在.NET下使用正则表达式(如您所知),请使用IgnoreCase选项。


此正则表达式中不同部分的说明

  • ^[a-z0-9]{2}字符串必须以两个与\w匹配的字符开头(即[a-z0-9A-Z])
  • ([.-])下一个字符必须是点或连字符,从现在起\1将包含此值
  • ([a-z0-9]{2}\1){0,8}我们需要0到8对 2 *字母数字字符 + 使用的第一个分隔符
  • [a-z0-9]{2}字符串必须以两个字母数字字符结尾。

答案 1 :(得分:1)

我试过了:

^[[:alnum:]]{2}([-.])[[:alnum:]]{2}(?:\1[[:alnum:]]{2}){0,8}$

您需要两端的锚点才能使其与整个字符串匹配。使用[[:alnum:]]匹配所有字母数字,基于区域设置。如果您只想要我们用英语考虑的那些,不管语言环境如何,您都希望在每种情况下都使用[A-Za-z0-9]

最棘手的部分是反向引用\1,它确保您始终使用相同的分隔符---它指的是([-.])中的捕获括号。因此,当你有20到8个重复的分隔符后跟2个字母数字时,分隔符总是相同的。

我在Perl中尝试了这个,并且它传递了一些我扔给它的测试字符串。如果您使用的是其他语言/图书馆,您的里程可能会有所不同。

答案 2 :(得分:0)

这将是:

[a-z0-9]{2}\([.][a-z0-9]{2}\){1,9}|[a-z0-9]{2}\([-][a-z0-9]{2}\){1,9}

{2}正好意味着2

{1,9}表示至少一个,最多9个

\(某事物\)是一个分组

a | b表示匹配a或b

答案 3 :(得分:0)

...可能

([\p{L}0-9]{2})(\.|-)([\p{L}0-9]{2})

这也处理Unicode字母,但我不确定它是否符合您的需要,因为“有效”集合中的前两行包含< 2 alpha-num><。>< ; 2 alpha-num<。>< 2 alpha-num>< 2>< 2 alpha-num>而不是您在问题中提到的格式< 2 alpha-num><。>< 2 alpha-num>

希望这有帮助。

答案 4 :(得分:-1)

这可能有效:

^[\w\d][\w\d](?:([.-])[\w\d][\w\d])(?:\1[\w\d][\w\d]){,8}