【发布时间】:2010-05-10 14:09:03
【问题描述】:
我需要编写一个匹配“abc”、“ab”、“ac”、“bc”、“a”、“b”、“c”等字符串的正则表达式。顺序很重要,它不应该与同一部分的多个外观相匹配。
a?b?c?几乎成功了。除了它也匹配空字符串。有什么方法可以防止它匹配空字符串,或者可能有不同的方法来为任务编写正则表达式。
【问题讨论】:
我需要编写一个匹配“abc”、“ab”、“ac”、“bc”、“a”、“b”、“c”等字符串的正则表达式。顺序很重要,它不应该与同一部分的多个外观相匹配。
a?b?c?几乎成功了。除了它也匹配空字符串。有什么方法可以防止它匹配空字符串,或者可能有不同的方法来为任务编写正则表达式。
【问题讨论】:
^(?=.)a?b?c?$
这将检查是否至少有一个字符具有前瞻功能并匹配您的正则表达式。
【讨论】:
要使用纯正则表达式执行此操作,您必须将其扩展到所有可能性:
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?
}
【讨论】:
您可以写下所有排列(这是一种痛苦)或没有遗漏字母的所有可能性(ab?c?|a?bc?|a?b?c),这有点不那么痛苦。
【讨论】:
尝试将您遇到的所有问题的所有功能打包到一个正则表达式中是没有意义的。最好的解决方案是编写明显的正则表达式,并添加对零长度的检查。只有在绝对必要时,您才应该更加聪明地使用正则表达式 - 例如,如果您必须与一个不可更改的 API 交互,该 API 只接受一个 一个正则表达式,仅此而已。
【讨论】: