偶数个1的位串的正则表达式

时间:2010-04-24 05:18:11

标签: regex compiler-construction grammar

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的数量(偶数与否)不是零的数量无关紧要。

那么这是正确的选择,为什么?

7 个答案:

答案 0 :(得分:9)

如果错误。它不会与0110(或任何仅为零的非空字符串)匹配

B代表OK。我不打算在这里证明它,因为页边距太小了。

C不匹配010101010(中间的零不匹配)

如你所说,D不会被00或任何其他#匹配而没有匹配。

所以只有B

答案 1 :(得分:2)

要解决这个问题,你应该

  1. 为所有“不正确”的正则表达式提供反例模式。这将是L中未匹配的字符串,或L中匹配的字符串。
  2. 为了证明剩下的“正确”模式,你应该回答两个问题:

    • 与该模式匹配的每个字符串都属于L吗?这可以通过设计每个匹配字符串应满足的属性来完成 - 例如,某些字符的出现次数......
    • L中的每个字符串都与正则表达式相匹配吗?这是通过将L划分为易于分析的子类,并显示每个子类以自己的方式匹配模式来完成的。
  3. (由于[作业]没有具体答案)。

答案 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)

查找应匹配但不匹配的示例。 0110111100都应匹配,但每一个都失败了

答案 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)

输出:

  • 删除了c,因为它在0110上失败了
  • 删除了d,因为它在0110上失败了
  • 删除了一个因为它匹配1
  • 删除了b,因为它匹配10