这可能与此相同,但这是我第一次看到正则表达式和班级中的其他所有人显然已经上了另一个课程。我不遵循的主要内容是使用癌症(应该允许除之后的所有内容)。
所以问题是:
给出一个正则表达式:{0,1,2}上的所有字符串不包括子字符串12。
我知道(0 | 1 | 2)*将是所有字符串。但是,您想避免12.我看的方式是您只是在1后不想要2,所以我说:
(0|1[^2]|2)*
我阅读的方式是,如果是0,则将0放0并再次进行括号。如果是1,将一个不是1个。但是,从技术上讲,"无"是什么,那么它会回来并像1 [Nothing]一样,绕着2圈,然后将其1。[没有] 2 = 12?还是我希望这样做,并确保在1之后永远不会到达2,同时仍然让过程继续?
我不确定我说的话是否有意义,所以请告诉我您是否需要澄清,我会尝试hehe
预先感谢。
sean
您的正则将一次从输入字符串一个处理一个字符。您的正则表达式将匹配字符串" 112",这不符合您的要求。(第一个" 1"将与您的图案中的1匹配,然后第二个" 1"将匹配[^2],因为" 1"不是2。然后它将匹配字符串中的" 2"在图案中对抗2。
您需要一种方法来说" 1不跟随2",而实际上并未"消耗" 1个角色。P>
^(?:0|1(?!2)|2)*$
这说明整个字符串(这就是为什么我使用 ^ and $锚)必须由括号表达式中的字符组成:a" 0",a" 2"或a a"1"那没有立即接下来是" 2"。
我不遵循的主要内容是使用癌
我想你的意思是男人吗?看看否定的字符类。
[…]放一个1,而不是2。但是,从技术上讲,"无"是什么,所以它会回来,像1 [Nothing]1 [nothing] 2 = 12?
否。字符类总是完全匹配一个字符,它不能匹配。表达式[^2]
并不意味着"任何东西 - 不包含 - 不是2
",而是"不是2
"的"一件事"。但是,一个人可以明确地使其可选。
否则我会希望并确保在1之后永远不会有2个,同时仍然让过程继续?
是。但是,它总是在1
之后至少需要一个字符,因此以1
结尾的字符串也无效。您应该明确允许1
s:
(0|1[^2]|2)*1*
我承认,我的答案是基于伯吉的,但我的答案不接受112(或1112,或11112等)。
(0|1+[^12]|2)*1*
我在此处测试了此正则:http://regexhero.net/tester/
希望您在明天上映之前就看到了...
编辑:为了正确测试它,请使用Pettit提到的 ^和$锚。但是,当您上交作业时不要包括它们。