2011-11-05 72 views
96

我是currentry编程的词汇算法,用于检查用户是否正确输入了单词。我有以下情况: 该单词的正确解决方案是“part1,part2”。 用户应该可以输入“part1”(答案1),“part2”(答案2)或“part1,part2”(答案3)。 我现在试着用以下的用户给出的字符串匹配,自动生成,正则表达式:和/或正则表达式中的运算符

^(part1|part2)$ 

这只回报回答1和2是正确的,而答案3将是错误的。我现在想知道是否有类似于|的操作符说“和/或”而不是“或者......”。 任何人都可以帮助我吗?

+0

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

+1

这个问题很不明确。当你需要的只是一个字符串与一组合法字符串的精确字符串比较时,为什么使用模式匹配?除非你的正则表达式编译器按照Perl的方式将替代方案优化为O(1)trie结构,否则你应该对哈希成员进行测试。其他正则表达式引擎在这方面并不是很聪明。 – tchrist

回答

132

我会假设你要动态地构建一个正则表达式包含换句话说比第1部分和第2部分,以及希望以不重要。如果是这样,你可以使用这样的事情:

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

正匹配:

part1 
part2, part1 
part1, part2, part3 

否定匹配:

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

请注意,“part1,part”1也是正数。哪个并不总是可取的 – dimaaan

+0

@dimaaan你错过了你的报价? “part1,part1”将会匹配,但“part1,part”不会。虽然你认为这种解决方案没有被这个解决方案所覆盖,但是对于在检查测试字符串是否由词汇表中的单词组成的情况下,OP的应用,我相信他确实想要一个正面的匹配,即使当一个单词是重复。无论你有多少实例,这个词仍然是词汇的一部分。 – Mithon

2

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

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

它工作吗?

2

或者您可以使用此:

^(?:part[12]|(part)1,\12)$ 
5

这是否工作,而交替?

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

或为什么不是这个?

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

的首部作品,第二为所有,但part2所有条件(使用GNU sed的4.1.5)