正则表达式与 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 条件最长匹配的主要内容,如果未能解决你的问题,请参考以下文章