正则表达式排除子串

时间:2014-01-29 21:07:25

标签: regex substring

这可能是基本的,但这是我第一次看到正则表达式,而班上的其他人显然已经在它上面了另一个类。我不遵循的主要是使用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,同时仍然让这个过程继续进行?

我不完全确定我所说的内容是否合理,所以请告诉我你是否需要澄清,我会尝试嘿嘿

提前致谢。

肖恩

3 个答案:

答案 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提到的^和$锚点。但是,当您打开作业时,请不要包含它们。