正则表达式中的AND / OR运算符如何表示?


219

我目前正在编程一种词汇算法,该算法可以检查用户是否正确输入了单词。我有以下情况:单词的正确解决方案是“ part1,part2”。用户应该能够输入“ part1”(答案1),“ part2”(答案2)或“ part1,part2”(答案3)。我现在尝试将用户给定的字符串与以下自动创建的正则表达式进行匹配:

^(part1|part2)$

这只会返回正确的答案1和2,而答案3是错误的。我现在想知道是否存在类似于|的运算符。表示and/or而不是either...or

谁能帮我解决这个问题?


1
正则表达式可能不是最佳解决方案。我会使用普通的字符串方法。
Felix Kling

3
这个问题没有明确指出。当您只需要与一组合法字符串进行精确的字符串比较时,为什么要使用模式匹配?除非您的regex编译器按照Perl的方式将替代方案优化为O(1)trie结构,否则您可能应该针对哈希成员资格进行测试。其他正则表达式引擎对此并不十分聪明。
tchrist 2011年

@tchrist用例可能是mongodb $or正则表达式匹配
Nadir Abbas

Answers:


283

我将假设您要动态构建一个正则表达式,以包含除part1和part2之外的其他单词,并且您希望顺序无关紧要。如果是这样,您可以使用以下方式:

((^|, )(part1|part2|part3))+$

正面比赛:

part1
part2, part1
part1, part2, part3

否定匹配项:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1

4
注意,“ part1,part” 1也将为正。这并不总是令人满意
dimaaan

1
@dimaaan您放错了引号吗?“ part1,part1”将是一个匹配项,但“ part1,part”将不是一个匹配项。尽管您是正确的,但这种解决方案并未涵盖这种情况,但是对于OP的应用程序,他正在检查测试字符串是否由词汇表中的单词组成,我相信即使在单词为重复。无论您有多少实例,该单词仍将是词汇表的一部分。
GauteLøken16年

30
'^(part1|part2|part1,part2)$'

它有效吗?


1
明显。正则表达式要求整个字符串匹配(^,$)
glasspill

5

这项工作没有交替吗?

^((part)1(, \22)?)?(part2)?$

还是为什么不呢?

^((part)1(, (\22))?)?(\4)?$

第一个适用于所有条件,第二个适用于所有条件part2(使用GNU sed 4.1.5)


4

不是正则表达式方面的专家,但是您可以做到^((part1|part2)|(part1, part2))$。用词来表达:“第1部分或第2部分或两者兼有”


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.