正则表达式与 C# 中的 OR 条件最长匹配

Posted

技术标签:

【中文标题】正则表达式与 C# 中的 OR 条件最长匹配【英文标题】:Regex matching longest with OR condition in C# 【发布时间】:2021-10-25 10:42:50 【问题描述】:

我正在尝试提取字符串的一部分,其中在正则表达式中设置了多个模式,并使用条件 OR ("|") 来测试它们。 不幸的是,我的第一个条件包含在第二个条件中,并将我的结果分成两组而不是一组。

我正在使用 C# 基本系统正则表达式。

这是我想要的一个例子:

我的字符串:abcdefghijklmopqrstuvwxyz

我的正则表达式:[a-m]+|[a-z]+

结果是 2 次匹配:

(1) : abcdefghijklm

(2) : opqrstuvwxyz

我想将整个字符串作为匹配项,即使在 (3) 结果中也是如此

有没有办法在不切换2个条件的情况下做到这一点?

真诚地, 和平与爱25

【问题讨论】:

试试这个正则表达式[a-z]+ 用你当前的语法是不可能的。正则表达式将继续查找匹配项(除了向后查找但不匹配)。因此,在您的第一个条件匹配后,它不会将光标移回另一个匹配项。 @Max 我的例子是我想要达到的简化版本,让我解释一下:我当然可以做 [az]+ 但在我的情况下 [am] 是另一个复杂的正则表达式 regex [a-m]+ 仅与字符在该范围内的顺序不匹配。所以aamm也会匹配 确保您想要优先考虑的替代方案是第一位的 - 这是唯一正确的方法。现实生活中的解决方案可能完全不同,因为这是一个 XY 问题。 【参考方案1】:

我认为拆分正则表达式会更好。正则表达式总是向前发展。一旦找到匹配项,它就不会回头。这就是为什么第二组不是从“a”开始,而是从“o”开始。

您可能可以执行两次正则表达式,因为如果能找到第三次匹配就可以了。

var regexFirstCheck = [a-m]+
var regexSecondCheck = [a-z]+

您的业务逻辑可以组合结果,因此您最终可以得到 2 或 3 个匹配项:

1: abcdefghijklm
2: abcdefghijklmopqrstuvwxyz

如果您需要 o-z 匹配,您可以使用您提供的正则表达式,或者只是创建另一个步骤。这可能会增加可读性:

var regexFirstCheck = [a-m]+
var regexSecondCheck = [o-z]+
var regexThirdCheck = [a-z]+

1: abcdefghijklm
2: opqrstuvwxyz
3: abcdefghijklmopqrstuvwxyz

【讨论】:

以上是关于正则表达式与 C# 中的 OR 条件最长匹配的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式将多次出现与字符串 C# 中的数字匹配

匹配c#中的正则表达式检查交叉连接查询

正则表达式将字符串限制为最短匹配与最长匹配(非贪婪组)?

Nginx中if语句中的判断条件

了解下C# 正则表达式

需要 c# 正则表达式将逗号列表中的任何单词与另一个字符串中的任何单词匹配