用于搜索多个条件的正则表达式字符串

时间:2018-04-26 13:31:17

标签: c# regex regex-lookarounds

我正在尝试编写一个匹配复杂条件的正则表达式。我正在尝试提取ABC之后的数字,但可能会有多个地方ABC 1234出现在我的字符串中。我还必须考虑在没有ABC的情况下使用数字的时间,但是在它之后使用。比如,ABC 1234 / 1134ABC 1234-1134,或两个数字之间的其他内容,例如and

我想要匹配的字符串看起来像这样:

ABC-210293CompletedReports  // Should match: ABC-210293
CC517036submittedbyfoobarforABC105799WRS877565 // Should match:  ABC105799
ABC#86765 // Should match: ABC#86765
abc99220 / 103743 // Should match: ABC99220 / 103743
AbC99220/103743 // Should match: ABC99220/103743
ABC 123 and 1123 // Should match: ABC 123 and 1123
SubmittedbyFooBar.forABC106156.Solutionbuilton4/23/20184:22PM // Should match: ABC106156

现在,我这个正则表达式:

((?i)ABC.(?-i))(\d[0-9]{0,10})|( *(\/|-|(?i)AND(?-i)) *\d[0-9]{0,10})

除了最后一个字符串之外,

将匹配上述每个字符串。它将匹配ABC106156,但也会匹配/23部分中的/201844/23/20184:22PM。我不知道如何在不丢失/abc99220 / 103743的匹配表达式的情况下排除AbC99220/103743

我听说环顾四周,但我不知道如何去做。如何忽略此正则表达式中的日期?

2 个答案:

答案 0 :(得分:1)

此RegEx适用于每个给定的示例。将它设置为不区分大小写(/gi)非常重要。

它会搜索ABC,然后可以选择-#whitespace,然后是digits(1个或更多)。在数字后面可以有一个可选的"/"" / "" and ",然后是digits(1个或更多)。

/(ABC(?:-|#|\s)?\d+(?:\/| \/ | and )?\d+)/gi

答案 1 :(得分:1)

您可以使用alternation来匹配您不想要的内容,并在群组中捕获您想要的内容。

您想要捕获的模式为4/23/20184:22PM,因此您可以将其与\d\/\d+\/\d+:\d+[AP]M匹配,或者如果您想要更具体,则使用\d{2}之类的量词。

您要在群组中捕捉的内容可能看起来像(ABC ?[#-]?\d+|\b\d+\b),其中ABC也使用了替代,或者仅使用字边界\b包围的数字。

(?i)(?:\d\/\d+\/\d+:\d+[AP]M|(ABC ?[#-]?\d+|\b\d+\b))

Demo C#