2014-01-28 19 views
1

我期待一个正则表达式与匹配任一 2 [0-9]重复(再一些其它图案)REGEX中继器 “或者” 操作员

[0-9]{2}[A-z]{4} 

OR 6 [0-9]重复(再一些其它图案)

[0-9]{6}[A-z]{4} 

以下是太包容:

[0-9]{2,6}[A-z]{4} 

问题

有没有一种方法可以指定2个或6个重复?

+2

**请勿在REGEX中使用[A-Z] **要匹配任何ASCII字母,大写或小写,请使用[[A-Za-z]]。 '[A-Z]'匹配所有那些,*加上*代码点恰好位于'Z'和'a'之间的几个标点符号。 –

+0

@AlanMoore谢谢你。正如我在下面的评论中提到的那样,'[A-z]'不是我正在使用的正则表达式的一部分,我只是用它作为我冗长的正则表达式的其他部分的表达,以便不会减损我的问题。 (谢谢你的教学时间,但是(没有讽刺,我实际上是新的正则表达式,并没有意识到这一点)。 –

回答

5

可以使用或|这样内的非-capturing组:

(?:[0-9]{2}|[0-9]{6})[A-z]{4} 

注意,使用[A-z]不仅包括大写和小写字母,也[\],^,_',它们位于ASCII码点中的Za之间。正如@AlanMoore在他的评论中指出的那样,使用[A-Za-z]作为信函。

+0

-1代表'[A-z]'。 (请参阅我的问题。) –

+1

@AlanMoore我假设OP有意这样做,但我想我可以添加一个笔记。 – Vache

+0

最初的'?:'是什么? – xbonez

3

这应该工作

(?:[0-9]{2}|[0-9]{6})[a-zA-Z]{4} 

你有一些测试情况下,我可以验证它。

  • 12asdf - 通过
  • 123456asdf - 通过
  • 1234asdf - 失败

但是,如果你没有正则表达式的开始锚定到一个字(\ b)或边界线(^),1234asdf将具有34asdf作为部分匹配。

因此,要么

\b(?:[0-9]{2}|[0-9]{6})[a-zA-Z]{4} 

^(?:[0-9]{2}|[0-9]{6})[a-zA-Z]{4} 

作为正则表达式的快速纲要改变

  • (?:)创建一个非捕获组
  • |选择变质剂之间[0-9] {2}和[0-9] {6}
  • ^相匹配的线
  • $的开始的线
  • \b的端部相匹配的字边界
  • [a-zA-Z]是匹配用于代替[A-z],因为它很可能意图是什么(所有字母字符,不区分大小写)

你也可以用\d这是任何数字速记取代你[0-9]秒。我能想到的最好的方式来纠正这一点,不明白的是部分匹配如下

(?:\b|^)(?:\d{2}|\d{6})[a-zA-Z]{4}(?:\b|$) 
+0

-1代表'[A-z]'。 (请参阅我的问题。) –

+1

@AlanMoore,我从用户问题中复制了“其他模式”。你是谁来判断他那部分正则表达式的有效性?给OP和我们留下评论,指出潜在的错误,但对它的低估仅仅是粗鲁。 – CaffGeek

+0

我是谁?我是那个知道'[A-Z]'总是*错误的人(显然是唯一一个)。也许我反应过度了,但是我有些震惊地看到有三个人似乎对盲目重复这样一个公然的,初学者的错误的正则表达式有所了解。 –

2

并不明显,但肯定的:

(?:\d{2}|\d{6}) 
+0

'\ d'不保证与[0-9]'相同。 Unicode是狂野而毛茸茸的! –

3

经典的方法是:

(?:[0-9]{2}|[0-9]{6})[A-z]{4} 

[字面上[0-9]{2} OR [0-9]{6}]

但是你也可以使用这一个,这应该是比上面一个小更高效的用更少的潜在回溯:

[0-9]{2}(?:[0-9]{4})?[A-z]{4} 

[这里,[0-9]{2}然后潜在其他4 [0-9]这使得总在所要求的条件6 [0-9]]


你可能不知道,[A-z]匹配的字母和一些其他字符,但它实际上做。

范围[A-z]有效等价于:

[A-Z\[\\\]^_`a-z] 

注意,相匹配的附加的字符是:

[ \ ]^_ ` 

[含自愿分离空间,但不是字符的一部分]

这是因为这些字符位于unicode表中的块字母和小写字母之间。

+0

当然,根据您的语言和您使用的函数,您可能需要使用锚来强制正则表达式应用于要测试的完整字符串。 – Jerry

+0

-1代表'[A-z]'。 (见我的评论在这个问题下。) –

+0

@AlanMoore我只是解决了OP正面临的实际问题,并假定他们知道'[Az]'实际上匹配了什么(在许多情况下,OP是正确的,并有其他原因,在其他,OP是错误的,不知道它...)。如果你坚持挑剔,这不是问题,我可以将其添加到我的答案。 – Jerry