Regex 如何处理;除「;编译器设计中的正则表达式?
我正在从事编译器设计,不知道如何处理RE中的语句 例如: 除(011001010)外,只有3位二进制数的文本的RE 我知道3位二进制数的RE为:Regex 如何处理;除「;编译器设计中的正则表达式?,regex,compiler-construction,regular-language,Regex,Compiler Construction,Regular Language,我正在从事编译器设计,不知道如何处理RE中的语句 例如: 除(011001010)外,只有3位二进制数的文本的RE 我知道3位二进制数的RE为: (0 | 1)(0 | 1)(0 | 1) 或 (0|1){3} 但是我如何处理这里的“除”呢?使用3次1或0,可以有8个组合。要匹配有效的5个组合,您可以列出所有5个组合,或者使用模式匹配1,然后是1和0的所有组合,或者匹配000 ^(?:1[01][01]|000)$ 例如,如果字符串较长,则还可以使用负前瞻 ^(?!01[01]|00
- (0 | 1)(0 | 1)(0 | 1)
- (0|1){3}
但是我如何处理这里的“除”呢?使用3次1或0,可以有8个组合。要匹配有效的5个组合,您可以列出所有5个组合,或者使用模式匹配1,然后是1和0的所有组合,或者匹配000
^(?:1[01][01]|000)$
例如,如果字符串较长,则还可以使用负前瞻
^(?!01[01]|001)[01]{3}$
注意您可以使用
[01]
而不是使用替代(0 | 1)
使用3次1或0将有8种组合。您想排除3个或它们,因此您可以考虑只列出其他5个。如果你有一个更大的集合,你可以使用一个负前瞻(?!
,使用一个字符类[01]
,而不是(0 | 1)
像^(?!0[01]1 | 010)[01]{3}$
,但是匹配它们的时间更短^[10]00 | 1[01][01]$
@theourthbird谢谢!这对我很有效。