使用vb.net在字符串中查找正则表达式不匹配部分

时间:2015-06-23 09:30:20

标签: regex vb.net

我有一个正则表达式

^\d{9}_[a-zA-Z]{1}_(0[1-9]|1[0-2]).(0[1-9]|[1-2][0-9]|3[0-1]).[0-9]{4}_\d*_[0-9a-zA-Z]*_[0-9a-zA-Z]*

和匹配正则表达式

的字符串
000066874_A_12.31.2014_001_2Q_ICAN14 

如果用户错误地输入了上述格式之外的字符串,如

000066874_12.31.14_001_2Q_ICAN14  

我需要找出我的正则表达式的哪个部分失败了。我尝试使用Regex.Matches和Regex.Match但是使用了这个我无法找到我的字符串得到的部分小姐与我的正则表达式匹配。我正在使用vb.net

1 个答案:

答案 0 :(得分:0)

这与正则表达式非常复杂。我设法制作了这个正则表达式,但你仍然需要在那之后检查捕获组。

^(?:(?:(\d{9})|.*?)_)?(?:(?:([a-zA-Z]{1})|.*?)_)?(?:(?:((?:0[1-9]|1[0-2]).(?:0[1-9]|[1-2][0-9]|3[0-1]).[0-9]{4})|.*?)_)?(?:(?:(\d*)|.*?)_)?(?:(?:([0-9a-zA-Z]*)|.*?)_)?(?:([0-9a-zA-Z]*)|.*?)$如果您正常工作,请参阅演示:https://regex101.com/r/aJ1wG1/2

下划线之前的每个部分都是一个捕获组,如果没有捕获组,则会出现错误。正如您在示例中所看到的,第一个示例中不存在$ 3,因此,日期中存在错误。在第二个例子中,$ 2不存在,因此$ 2以后不存在。第3个例子是正确的,所有6个caputre组都在那里。

当正则表达式变得如此庞大时,它表明可能需要使用不同的方法来解决问题,但这可能会为您提供一些额外的组结果检查代码。