我有一个棘手的正则表达式,我需要实现,我不是一个伟大的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.
想法?
答案 0 :(得分:3)
为什么让事情变得比以前更复杂?
^[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}