正则表达练习

时间:2011-10-29 12:31:13

标签: regex regular-language

L= { w is {1,2,3}* 
   | w starts with 3, ends with 2 and there is a substring of only 1 with length 
       even equal or >2}.

因此,一些测试的结果必须是:

3323112: accepted
311211112: non accepted
31112: non accepted
32: non accepted
2113: non accepted
313212: non accepted

我的回答是:3*(11)*2*

但是它没有通过一些测试......有人可以帮助我吗?

第二项练习是:

L= { w is {1,2}* 
   | in w after every 1 there is one or more 2, but if the 1 is the last 
     character it could be the last (no 2 after it)}

测试字符串:

1: accepted
222:  accepted
221212122:  accepted
1222121:  accepted
111221: not  accepted
11: not  accepted

我的解决方案是(12*)*

但它没有通过一些测试......请帮帮我。

3 个答案:

答案 0 :(得分:1)

我不打算为你做功课,但我会指出你要做的事情有几个问题:

  • 一颗星本身不是通配符。它并不意味着“匹配任何东西”。 量词 修改前一个令牌。您希望使用.*代替*来允许任意数量的任何字符。
  • 表达式.*(11)*.*也匹配奇数为1的字符串,因为.也可以是1。紧接在1s之前和之后的数字必须是“not-a-1”(即2或3)。

希望这对你有帮助。

答案 1 :(得分:1)

  • 以3:^3
  • 开头
  • 以2:2$
  • 结尾
  • 包含至少两个1的序列:1{2,}
  • 结果正则表达式:^3[1-3]*1{2,}[1-3]*2$[1-3]*件允许任何数字1到3,因为那里没有要求)
  • 编辑:我想我误解了关于1s的条件,
    所以它的模式是:(?<!1)(1{2})+(?!1)(lookbehind和lookahead以确保1被隔离)
  • 修订模式:^3[1-3]*(?<!1)(1{2})+(?!1)[1-3]*2$

  • 每1次之后至少有一次2:(?<!1)12+(确保在此之前没有1)
  • 最终1可能没有2:1?$
  • 结果:^((?<!1)12+)*1?$

希望这会有所帮助。祝你好运,他们很难学习,但一旦掌握了它就很容易。

答案 2 :(得分:1)

因为这看起来像是作业,所以我不会直截了当地回答。您将要查看正则表达式中的修饰符。 *表示重复0次或更多次。对于字符类,还有+?和方括号。还要注意,一些可用的东西可能依赖于你正在使用的正则表达式解析器(通常称为“味道”)。但是一些基础知识通常都是一样的。

祝你好运!