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

Posted

技术标签:

【中文标题】用于搜索多个条件的正则表达式字符串【英文标题】:Regex string to search for multiple conditions 【发布时间】:2018-10-07 05:35:27 【问题描述】:

我正在尝试编写一个匹配多个复杂条件的正则表达式。我正在尝试提取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,但也将匹配4/23/20184:22PM 部分中的/23/20184。我不知道如何在不丢失abc99220 / 103743AbC99220/103743 的匹配表达式的情况下排除/

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

【问题讨论】:

如果您知道需要忽略的确切模式,则始终可以匹配和忽略某些内容。在开头添加\d1,2/\d1,2/\d4|,并且只使用捕获的子字符串。类似this. 您能解释一下逻辑和预期结果吗?我加倍我理解正确(就像下面的所有人一样)。查看this C# demo 【参考方案1】:

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

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

您想在组中捕获的内容可能类似于(ABC ?[#-]?\d+|\b\d+\b),它还使用ABC 或仅由单词边界包围的数字\b 替换模式。

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

Demo C#

【讨论】:

【参考方案2】:

此 RegEx 确实适用于每个给定的示例。重要的是你让它不区分大小写 (/gi)。

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

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

【讨论】:

以上是关于用于搜索多个条件的正则表达式字符串的主要内容,如果未能解决你的问题,请参考以下文章

关于grep后跟多个正则查询条件的问题

Linux学习-正则表达式与文本搜索

shell脚本之正则表达式

grep命令及正则表达式

JS正则表达式

正则表达式匹配多个字符串但不匹配特定字符串