.net \D+?在正则表达式中不起作用

.net \D+?在正则表达式中不起作用,.net,regex,.net,Regex,我有型号名称: DP-7451P MPG 3434 MP-WH40B MP-W40B MP-1820G 我需要一个正则表达式,它可以组成上面的两到三组,第一组应该在破折号或空格之前,另一组应该是前面的数字或字符集,最后一组应该是表示产品颜色的最终字符 在我的特定场景中,这就是我要寻找的 (DP)(7451)(P) (PZG)(3434)() (GF)(WH40)(B) (MP)(W40)(B) (VRN)(1820)(G) 我尝试了\D{2,3}[-|\s]\D+?\D+\D+?。但它不起作

我有型号名称:

DP-7451P
MPG 3434
MP-WH40B
MP-W40B
MP-1820G
我需要一个正则表达式,它可以组成上面的两到三组,第一组应该在破折号或空格之前,另一组应该是前面的数字或字符集,最后一组应该是表示产品颜色的最终字符

在我的特定场景中,这就是我要寻找的

(DP)(7451)(P)
(PZG)(3434)()
(GF)(WH40)(B)
(MP)(W40)(B)
(VRN)(1820)(G)
我尝试了\D{2,3}[-|\s]\D+?\D+\D+?。但它不起作用。是不是\D+?要搜索零个或多个非数字字符吗?那我该怎么做呢

我正在使用来测试我的工作。

使用+字符可以指定至少出现一个正在进行的字符。这就是为什么不匹配案例1、2和4。您应该改为使用*字符,它匹配零或更多

还有一些其他的注意事项可以让它发挥作用。首先,我们需要指定一些锚点,^$,以将其作为一个整体字符串进行匹配。然后我们有一组1个或更多的a-Z字母,[a-Z]+。后跟连字符或空格[-|\s]。在此之后是一些可选字母[A-Z]*,后面是可变数量的数字\d*,最后是一些可选字母[A-Z]*

这个正则表达式与您在问题中提供的测试用例中的所有正则表达式匹配。在这里,您可以看到我的正则表达式正在运行:。

使用+字符,您可以指定至少出现一个进行中的字符。这就是为什么不匹配案例1、2和4。您应该改为使用*字符,它匹配零或更多

还有一些其他的注意事项可以让它发挥作用。首先,我们需要指定一些锚点,^$,以将其作为一个整体字符串进行匹配。然后我们有一组1个或更多的a-Z字母,[a-Z]+。后跟连字符或空格[-|\s]。在此之后是一些可选字母[A-Z]*,后面是可变数量的数字\d*,最后是一些可选字母[A-Z]*


这个正则表达式与您在问题中提供的测试用例中的所有正则表达式匹配。在这里,您可以看到我的正则表达式正在运行:。

此正则表达式应根据您的要求工作

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


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

此正则表达式应根据您的要求工作

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

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

从我所看到的情况来看,\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+?匹配一个或多个非数字字符,而不是零个或多个。尾随?只是让+不贪婪。

从我所看到的来看,\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+?匹配一个或多个非数字字符,而不是零个或多个。尾随?只是使+不贪婪。

\D是一个非数字字符,\D+是一个或多个非数字,\D+是一个或多个数字。没错,但它不起作用。确实要转义“\”?\D是一个非数字字符,\D+是一个或多个非数字,\D+是一个或多个数字。确切地说,但是它不起作用。你确定你逃过了“魔戒”吗?你不需要魔戒吗?在它之后。我认为@Shimmy混淆了可选/必需和懒惰/贪婪的匹配。你不需要?在它之后。我认为@Shimmy混淆了可选/必需和懒惰/贪婪匹配。它不起作用。第三组与第二组一起被选中。你是对的,第二组中的+应该是非贪婪的。我编辑过
e相应地回答。它不起作用。第三组与第二组一起被选中。你是对的,第二组中的+应该是非贪婪的。我已相应地编辑了答案。