【regex】字符组

版权声明:欢迎转载,但请注明出处 https://blog.csdn.net/HaoDaWang/article/details/82947963

【regex】字符组

国庆的第五天,荒废了整整一天了,今天除了长得像个人,其余跟猪没什么区别,想着写点东西,以前说些一篇关于正则表达式的基础知识,但是一直没有时间去写,今天恰好可以写写,其实很多人都知道正则这个东西,而且也仅仅会使用一些基础的元字符,大多是看网上的一些精简教程,简单的介绍了一下,可能晦涩难懂,想着把这些也写出来,看看能不能好理解一些,帮助刚学习正则的(同学!!)能够少走弯路。

哈,废话不多说,开始。

字符组是我们在正则表达式中常用的一个东西,可能这是它的学名听上去很生疏,但是你们一定用过。在正则表达式中,字符组经常用[]括起来,比如

[abc]

就是一个字符组,字符组只匹配一个字符!!这个很重要,有点像选择结构,比如上面的[abc],就匹配a或者b或者c,并且在字符组中,很多元字符都变成了普通的字符,比如

[.]

在正则表达式中,.通常匹配一个任意字符,但是在字符组中,它就只匹配一个普通的.,但是也不是说字符组中就没有元字符了,比如字符组中的连接符-,用连接符可以表示一个范围,比如

[a-z]

表示az的所有字符,也就是所有的小写字母,但是必须要注意的是,连接符不能出现在字符组的开头或结尾,比如

[-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"

猜你喜欢

转载自blog.csdn.net/HaoDaWang/article/details/82947963