2011-10-24 56 views
1

不工作,我有车型名称: D +?在正则表达式

DP-7451P 
MPG 3434 
MP-WH40B 
MP-W40B 
MP-1820G 

我需要有一个正则表达式,可以让两组或三组以上的,1组应该是破折号(或空间)前,其他应该是前面的数字或字符集,最后一组应该是最终字符(它代表产品颜色)。

在我的特殊情况下,这就是我要找的

(DP)(7451)(P) 
(PZG)(3434)() 
(GF)(WH40)(B) 
(MP)(W40)(B) 
(VRN)(1820)(G) 

我试过(\D{2,3})[-|\s](\D+?\d+)(\D+?)。但它没有完成这项工作。是不是\D+?意味着搜索零个或多个不是数字的字符?那我该怎么做呢?

我使用this来测试我的工作。

+2

\ D是非数字字符,\ D +是一个或多个非数字,\ d +是一个或多个数字。 – kamui

+0

没错,但它不起作用。 – Shimmy

+0

你确定你逃脱了'\\'? –

回答

4

使用+字符可以指定有至少有1发生了前进字符。这就是为什么你不匹配情况1,2和4.你应该使用*字符,而不是匹配或更多。

一些其他注意到它的工作。首先,我们需要指定一些锚点,即^ $,以将其匹配为整个字符串。然后我们有一组1个或更多的A-Z字母,[A-Z]+。这后面跟一个连字符或一个空格,[-|\s]。在这之后来了一些可选的字母,[A-Z]*,其次是可变数量的数字\d*,最后是一些可选的字母[A-Z]*

^([A-Z]+)[-|\s]([A-Z]*\d+)([A-Z]*)$ 

此正则表达式匹配所有的测试用例在你所提供的cases质疑。在这里你可以看到我的正则表达式:http://regexr.com?2v1og

+0

之后你不需要'?'。我认为@Shimmy混淆了可选/懒惰/贪婪匹配的要求。 –

1

此正则表达式应该工作按您的要求

^(\D{2,3})[-\s](\D*?\d*?)(\D?)$

我没有太大变化,只是用*代替+。另一个变化是匹配颜色编码的最后一组,只是一个字符,所以我用\D?替换了\D+?。如果您的颜色代码是多个字符,那么您最后也可以使用(\D*)

1

从我所看到的,\D是这个工作的错误工具。在您的示例中,第一个感兴趣的部分由两个或三个(大写ASCII字母)组成,第二个是字母和数字的混合,第三个是单个字母,可选。如果情况总是如此,那么您的正则表达式应该是:

^([A-Z]{2,3})[-\s]([A-Z0-9]+?)([A-Z]?)$ 

...假设您将每个零件编号单独匹配。如果你正在采摘出来的文本较大的身体,单词边界可能是为了:

\b([A-Z]{2,3})[-\s]([A-Z0-9]+?)([A-Z]?)\b 

如果可以有小写字母,以及,你可以将它们添加到字符类或使整个正则表达式不区分大小写,但我没有看到\D(顺便说一下,它会匹配连字符,空格和字母)。

此外,\D+?匹配一个或多个非数字字符,不以上。尾随?只是使+非贪婪。

+0

它不起作用。第三组与第二组一起被选中。 – Shimmy

+0

你说得对,第二组中的“+”应该是非贪婪的。我已经编辑了相应的答案。 –

相关问题