【问题标题】:Regex with all optional parts but at least one required包含所有可选部分但至少需要一个的正则表达式
【发布时间】:2010-05-10 14:09:03
【问题描述】:

我需要编写一个匹配“abc”、“ab”、“ac”、“bc”、“a”、“b”、“c”等字符串的正则表达式。顺序很重要,它不应该与同一部分的多个外观相匹配。

a?b?c?几乎成功了。除了它也匹配空字符串。有什么方法可以防止它匹配空字符串,或者可能有不同的方法来为任务编写正则表达式。

【问题讨论】:

    标签: .net regex


    【解决方案1】:
    ^(?=.)a?b?c?$
    

    这将检查是否至少有一个字符具有前瞻功能并匹配您的正则表达式。

    【讨论】:

    • 谢谢。这完全适用于它是完整字符串而不是子字符串的前提条件。如果我删除 ^ 和 $ 它匹配的次数与其他符号一样多。无论如何,这是非常接近的,我会给你一个,但 Weblog 有一个更接近的解决方案。谢谢!
    【解决方案2】:

    要使用纯正则表达式执行此操作,您必须将其扩展到所有可能性:

    ab?c?|a?bc?|a?b?c
    

    如果您有前瞻功能,您可以确保字符串非空。或者,您可以在将字符串传递给表达式之前验证字符串的长度至少为 1,具体取决于您选择的语言。

    例如,.NET 前瞻可能如下所示:

    ^(?=[abc])a?b?c?$
    

    或者你可以在匹配之前测试你的字符串的长度:

    if (YourString.Length == 1) {
       // matching code goes here, using the expression a?b?c?
    }
    

    【讨论】:

    • (?=[abc])a?b?c?甚至更好 (?=(a|b|c))a?b?c? (因为我真正的 a、b、c 不是字母,而是更长的结构)似乎工作得很好。谢谢!
    【解决方案3】:

    您可以写下所有排列(这是一种痛苦)或没有遗漏字母的所有可能性(ab?c?|a?bc?|a?b?c),这有点不那么痛苦。

    【讨论】:

    • 是的,我知道我可以这样做,但这是我想要避免的。
    【解决方案4】:

    尝试将您遇到的所有问题的所有功能打包到一个正则表达式中是没有意义的。最好的解决方案是编写明显的正则表达式,并添加对零长度的检查。只有在绝对必要时,您才应该更加聪明地使用正则表达式 - 例如,如果您必须与一个不可更改的 API 交互,该 API 只接受一个 一个正则表达式,仅此而已。

    【讨论】:

    • 问题不仅是零长度,而且它基本上匹配每个不匹配符号之间的所有“虚无”。所以对于像 "zxvnm" 这样的字符串会有 5 个匹配项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2022-08-24
    相关资源
    最近更新 更多