【regex】字符组
国庆的第五天,荒废了整整一天了,今天除了长得像个人,其余跟猪没什么区别,想着写点东西,以前说些一篇关于正则表达式的基础知识,但是一直没有时间去写,今天恰好可以写写,其实很多人都知道正则这个东西,而且也仅仅会使用一些基础的元字符,大多是看网上的一些精简教程,简单的介绍了一下,可能晦涩难懂,想着把这些也写出来,看看能不能好理解一些,帮助刚学习正则的(同学!!)能够少走弯路。
哈,废话不多说,开始。
字符组是我们在正则表达式中常用的一个东西,可能这是它的学名听上去很生疏,但是你们一定用过。在正则表达式中,字符组经常用[]
括起来,比如
[abc]
就是一个字符组,字符组只匹配一个字符!!这个很重要,有点像选择结构,比如上面的[abc]
,就匹配a
或者b
或者c
,并且在字符组中,很多元字符都变成了普通的字符,比如
[.]
在正则表达式中,.
通常匹配一个任意字符,但是在字符组中,它就只匹配一个普通的.
,但是也不是说字符组中就没有元字符了,比如字符组中的连接符-
,用连接符可以表示一个范围,比如
[a-z]
表示a
到z
的所有字符,也就是所有的小写字母,但是必须要注意的是,连接符不能出现在字符组的开头或结尾,比如
[-az]
[az-]
这个匹配的就是普通的字符。
除此之外,字符组中还有一个常用的元字符,它是^
,它只能出现在字符组开头,它表示否定断言,表示只匹配非 字符组里的字符,举个栗子
[^abc]
表示匹配除开a
,b
,c
之外的其他字符,但是字符组只匹配一个字符的本质是不变的。
举个小栗子
匹配引号中的内容
现在咱有这样一个字符串
hello my name is "zhangsan", and his name is "lisi".
嚯!我们想要匹配的是zhansgan
,很简单对吧,我们可以这样写
".*?"
这样确实可以匹配到我们想要的结果,假如这是某个 App 上的一段文本,这个 App 会随着设备的大小自适应,如果用户设备很小,于是,它可能变成下面这样
hello my name is "zhangsa
n", and his name is "lisi".
你会惊奇的发现原来的正则会匹配到错误的子串,它会匹配到
", and his name is "
这并不是我们想要的结果啊,为什么会这样?
这是因为,.
元字符一般不会(得根据具体实现来定)匹配到换行符,于是当匹配到第一行行尾的时候,发现行尾没有"
,于是回溯,最终失败,重新开始,扫描第二行,得到结果。
如何避免这种情况呢?把.*?
换成[^"]*?
,这样的话就能得到你想要的结果了,这是因为,[^"]*
会匹配除开"
之外的其他字符,包括换行符,于是最终得到结果
"zhangsa
n"