我正在尝试编写一个匹配复杂条件的正则表达式。我正在尝试提取ABC
之后的数字,但可能会有多个地方ABC 1234
出现在我的字符串中。我还必须考虑在没有ABC
的情况下使用数字的时间,但是在它之后使用。比如,ABC 1234 / 1134
或ABC 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
部分中的/20184
和4/23/20184:22PM
。我不知道如何在不丢失/
和abc99220 / 103743
的匹配表达式的情况下排除AbC99220/103743
。
我听说环顾四周,但我不知道如何去做。如何忽略此正则表达式中的日期?
答案 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
包围的数字。