这可能是基本的,但这是我第一次看到正则表达式,而班上的其他人显然已经在它上面了另一个类。我不遵循的主要是使用carot(应该允许除了之后的所有内容)。
所以问题是:
给出一个正则表达式:{0,1,2}以上的所有字符串不包含子字符串12。
我知道(0 | 1 | 2)*将是所有字符串。但是,你要避免12.我正在看这个方法是你只是不想在1之后得到2,所以我把:
(0|1[^2]|2)*
我读这个的方法是,如果它是0,放0并再次做括号;如果它是1,则放1和SOMETHING不是2.但是,技术上“没有”是什么,所以它会回来并且像1 [无],绕圈并放2,从而使它成为1 [没什么] 2 = 12?或者它会像我希望的那样做,并确保在1之后永远不会出现2,同时仍然让这个过程继续进行?
我不完全确定我所说的内容是否合理,所以请告诉我你是否需要澄清,我会尝试嘿嘿
提前致谢。
肖恩
答案 0 :(得分:2)
您的正则表达式将一次处理输入字符串中的字符。您的正则表达式将匹配字符串“112”,这不符合您的要求。 (第一个“1”将匹配您的模式中的1,然后第二个“1”将匹配[^ 2],因为“1”不是2.然后它将匹配字符串中的“2”反对模式中的2。
你需要一种方法来说“一个没有跟随2的1”,而不是实际上“消耗”1之后的角色。这是一个正则表达式,但它需要负面的预测:
^(?:0|1(?!2)|2)*$
这表示整个字符串(这就是我使用^和$ anchors的原因)必须由括号表达式中的字符组成:“0”,“2”或“ 1“不是紧接着是”2“。
答案 1 :(得分:1)
我不遵循的主要事情是使用carot(应该允许除了之后的所有内容)。
我猜你的意思是caret?看看negated character classes。
[...]放一个1和SOMETHING不是2.然而,技术上“没有”是什么东西,所以它会回来并且像1 [无],绕圈并放2,从而制作它1 [无] 2 = 12?
没有。一个字符类总是匹配一个字符,它不能匹配任何东西。表达式[^2]
并不意味着“任何东西 - 包括任何内容 - 不是2
”,而是“一件不是2
”的东西。然而,人们可以明确地optional。{/ p>
或者它会像我希望的那样做,并确保在1之后永远不会出现2,同时仍然让这个过程继续进行?
是。但是,它始终需要1
后至少一个字符,因此以1
结尾的字符串也将无效。您应该明确地允许1
:
(0|1[^2]|2)*1*
答案 2 :(得分:0)
我承认,我的回答是基于Bergi的,但我的不会接受112(或1112,或11112等)。
(0|1+[^12]|2)*1*
我在这里测试了这个正则表达式:http://regexhero.net/tester/
希望你在明天转身之前看到这个......
编辑: 为了正确测试它,请使用Pettit提到的^和$锚点。但是,当您打开作业时,请不要包含它们。