\ d +?在Regex中不起作用

时间:2011-10-24 15:34:14

标签: .net regex

我有型号名称:

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来测试我的工作。

3 个答案:

答案 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

答案 1 :(得分:1)

这个正则表达式应该按照你的要求工作

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

我的变化不大,只是将+替换为*。另一个变化是匹配颜色编码的最终组,这只是一个字符,因此我将\D+?替换为\D?。如果您的颜色代码是多个字符,那么您也可以使用(\D*)作为最终组。

答案 2 :(得分: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+?匹配一个或更多非字母字符,而不是或更多。尾随?只会使+非贪婪。