设L= { w in (0+1)* | w has even number of 1s}
,即L是偶数为1的所有位串的集合。下面哪个正则表达式代表L?
A)(0 * 10 * 1)*
B)0 *(10 * 10 *)*
C)0 *(10 * 1)* 0 *
D)0 * 1(10 * 1)* 10 *
根据我的选择D
永远不会正确,因为它不代表零1的位串。但其他选择呢?我们担心1的数量(偶数与否)不是零的数量无关紧要。
那么这是正确的选择,为什么?
答案 0 :(得分:9)
如果错误。它不会与0110(或任何仅为零的非空字符串)匹配
B代表OK。我不打算在这里证明它,因为页边距太小了。
C不匹配010101010(中间的零不匹配)
如你所说,D不会被00或任何其他#匹配而没有匹配。
所以只有B
答案 1 :(得分:2)
要解决这个问题,你应该
L
中未匹配的字符串,或L
中匹配的字符串。为了证明剩下的“正确”模式,你应该回答两个问题:
L
吗?这可以通过设计每个匹配字符串应满足的属性来完成 - 例如,某些字符的出现次数...... L
中的每个字符串都与正则表达式相匹配吗?这是通过将L
划分为易于分析的子类,并显示每个子类以自己的方式匹配模式来完成的。(由于[作业]没有具体答案)。
答案 2 :(得分:1)
检查模式B
:
^0*(10*10*)*$
^ # match beginning of string
0* # match zero or more '0'
( # start group 1
10* # match '1' followed by zero or more '0'
10* # match '1' followed by zero or more '0'
)* # end group 1 - match zero or more times
$ # end of string
很明显,这种模式只匹配有0,2,4,... 1
的字符串。
答案 3 :(得分:0)
查找应匹配但不匹配的示例。 0
,11011
和1100
都应匹配,但每一个都失败了
答案 4 :(得分:0)
C不正确,因为它不允许一组中的第二组与下一组中的前一组之间的任何0。
答案 5 :(得分:0)
这个答案最适合这种语言
(0*10*10*)
答案 6 :(得分:-1)
一个快速的python脚本实际上消除了所有可能性:
import re
a = re.compile("(0*10*1)*")
b = re.compile("0*(10*10*)*")
c = re.compile("0*(10*1)* 0*")
d = re.compile("0*1(10*1)* 10*")
candidates = [('a',a),('b',b),('c',c),('d',d)]
tests = ['0110', '1100', '0011', '11011']
for test in tests:
for candidate in candidates:
if not candidate[1].match(test):
candidates.remove(candidate)
print "removed %s because it failed on %s" % (candidate[0], test)
ntests = ['1', '10', '01', '010', '10101']
for test in ntests:
for candidate in candidates:
if candidate[1].match(test):
candidates.remove(candidate)
print "removed %s because it matched on %s" % (candidate[0], test)
输出: