AND/OR 运算符在正则表达式中如何表示?
Posted
技术标签:
【中文标题】AND/OR 运算符在正则表达式中如何表示?【英文标题】:How is the AND/OR operator represented as in Regular Expressions? 【发布时间】:2011-12-22 16:18:53 【问题描述】:我目前正在编写一个词汇算法来检查用户是否正确输入了单词。我有以下情况: 这个词的正确解决方案是“part1, part2”。 用户应该能够输入“part1”(答案 1)、“part2”(答案 2)或“part1, part2”(答案 3)。 我现在尝试将用户给出的字符串与以下自动创建的正则表达式匹配:
^(part1|part2)$
这只会返回正确的答案 1 和 2,而答案 3 将是错误的。我现在想知道是否有类似于 | 的运算符上面写着and/or
而不是either...or
。
谁能帮我解决这个问题?
【问题讨论】:
正则表达式可能不是最好的解决方案。我会使用普通的字符串方法。 这个问题没有详细说明。当您只需要与一组合法字符串进行精确的字符串比较时,为什么还要使用模式匹配?除非您的正则表达式编译器像 Perl 那样将备选方案优化为 O(1) trie 结构,否则您可能应该改为针对哈希成员进行测试。其他正则表达式引擎在这方面并不是很聪明。 @tchrist 用例可以是 mongodb$or
正则表达式匹配
【参考方案1】:
我将假设您想要动态构建一个正则表达式以包含除 part1 和 part2 之外的其他单词,并且您希望顺序无关紧要。如果是这样,你可以使用这样的东西:
((^|, )(part1|part2|part3))+$
正面匹配:
part1
part2, part1
part1, part2, part3
否定匹配:
part1, //with and without trailing spaces.
part3, part2,
otherpart1
【讨论】:
请注意,“part1, part”1 也是正数。这并不总是可取的 @dimaaan 您是否放错了引号? "part1, part1" 将匹配,但 "part1, part" 不会。尽管您是正确的,此解决方案未涵盖这种情况,但对于他正在检查测试字符串是否由词汇表中的单词组成的 OP 应用程序,我相信即使单词是重复。不管你有多少实例,这个词仍然是词汇表的一部分。【参考方案2】:'^(part1|part2|part1,part2)$'
有用吗?
【讨论】:
显然。正则表达式要求整个字符串匹配 (^, $)【参考方案3】:不是正则表达式专家,但您可以使用^((part1|part2)|(part1, part2))$
。换句话说:“第 1 部分或第 2 部分或两者兼而有之”
【讨论】:
【参考方案4】:这是否可以在没有交替的情况下工作?
^((part)1(, \22)?)?(part2)?$
或者为什么不这样?
^((part)1(, (\22))?)?(\4)?$
第一个适用于所有条件,第二个适用于除part2
之外的所有条件(使用 GNU sed 4.1.5)
【讨论】:
【参考方案5】:或者你可以使用这个:
^(?:part[12]|(part)1,\12)$
【讨论】:
【参考方案6】:使用 如果在 vim 中:
:s/\|/"/g
将替换 和 在 " 所以 lol 变成了“lol”
【讨论】:
以上是关于AND/OR 运算符在正则表达式中如何表示?的主要内容,如果未能解决你的问题,请参考以下文章