在这篇博客中,写一下正则语言的使用。
个人理解的正则语言,就是将一些字符串进行特点归类,然后用一种正则将之进行描述并捕捉。事实上,一个最简单的正则语言应该就是一个字符串,这个字符串对与其完全相同的字符串进行描述并捕捉。
然后,是一些基本的概念的讲述:
|:或符号,用来表示一个位置可能出现的数个可能的正则字串,比如正则:a|b,既可以接受a,也可以接受b。
*:重复符号,这个符号前面的一个或一串东西会被重复至少0次。这个东西的特点是可以重复0次,也就是说可能会产生一个空串,比如:(a|b)*,可以接受aaabbb,也可以接受ababab,或者bbb,甚至也能接受一个空串。
+:重复至少依次符号,这个符号会让前面的一串东西重复至少1次。这样有一个好处,就是不会再产生空串,事实上,我个人认为a+和aa*是等价的。+的使用我觉得是相当普遍的,比如,如果我想接受某个字符串,两个单词之间需要使用一个且仅有一个空格进行连接,并且这个字符串至少有一个单词,那么我可以描述成:([a-zA-Z]+ )*[a-zA-Z]+。
.:用来表示任意字符。比如.*,就可以接受所有的串。
?:可以用来描述一个可能存在的字符,比如,如果我想接受http和https两个字符串,那么我可以写成:http(s)?
差不多就是这些,还有一些转义符之类的就不赘言了,实在是太多了。
下面,是一道往年试题的做题过程:
看到这个东西,我们想着先把(2)(3)(4)描述的东西分别实现,再连接起来就行了,所以我做出:
其中,ABC就代表了123,值得注意的是,B中要求0不能作为开头的同时,要保证最小值为5,所以我考虑分类讨论B只有一位和有多位的情况,事实上,应该还有其他思路,不过这样也能写的出来。
再分析一个选择:
这种题我觉得可以考虑去找反例,事实上找反例一般也就几种思路,主要是在重复处做文章,看看在重复时是否会产生一个能出现“aba”这种而另一个不能,或者一个能出现“abb”而另一个不能。
先分析A:注意到前者整个是有*修饰的,而后者不是,所以很简单的可以想到前者可以接受空串,而后者显然不行。
然后是B:这个很简单,\w是所有字类字符,包含大小写字母数字以及下划线。
C是正确的。
D 没有进行详细分析,不过一眼看上去看到了^号,这个符号在[]里面和外面是截然不同的,在里面的话会进行一个取补集的操作,而在外面的话起到一个“开始符”的作用,所以我认为这个是在这里有问题的。