我有型号名称:
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来测试我的工作。
答案 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+?
匹配一个或更多非字母字符,而不是零或更多。尾随?
只会使+
非贪婪。