在程序中我们经常会遇到这样一种需求:
对一段文本(字符串)进行检索,找出满足某种规则的部分,比如说找出某段文本里面所有的:
所有这些,关键的关键,是定义规则。
这种规则,就可以用正则表达式(Regular Expression)来表示。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
飞哥做一个提炼:
几乎所有编程语言,都提供了对正则(表达式)的支持,但需要我们自己要学会编写正则表达式。
演示:使用匹配检测工具,找出所有的:a、9、ing……
打印不出来的字符:
又称为“元字符”,可匹配 '多种字符',常用的有:
注意上面的字母全是小写,如果变成大写就“取反”,比如:
上述特殊字符都有特殊含义(比如:^ $ .),但如果我们就需要匹配这些特殊字符呢?
用一个斜杠表示转义(即取消其特殊含义)即可,比如:\^ \$ \.
特殊字符有时候还不能满足我们的要求,比如说我们可能需要匹配一些自定义规则的字符:
[13579]
[5-9]字母也一样,比如[a-d],或者[X-Z]
[^0]
单个字符用方括号 [ ]。多个字符就需要用竖线(|)表示"或" 关系。比如:
在这句话 this is a goverment for the people, thank you! 里面找到this和the,其正则表达式就可以是:
this|the或者用圆括号包裹可选部分
th(is|e)
注意:
无论普通/特殊,正则表达式的字符都可以组合使用,比如:
可以用{}指定可重复次数:
简写方式
如果重复的是多个字符,可以用圆括号将其括来,后面直接跟{}或简写方式。
比如,IP地址由数字和点(.)组合而成的,最多每3个数字后面就接1个点,比如:192.168.0.10。正则表达式可以写成:
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
注意“\d{1,3}\.”重复了3次:这样显得比较累赘。
我们可以把“数字+.”视为一“组”,用圆括号(())括起来,将其重复3次,如下所示:
(\d{1,3}\.){3}\d{1,3}
根据以下(简略)条件:
写一个正则表达式验证(不是查找)用户输入的是不是身份证号码。
涉及的关键知识点:
默认取最大长度的匹配结果:贪婪模式。
比如这句话:
this is a goverment, of the people,for the people, by the people!
里我想取this is a goverment,(以逗号结束)
用正则表达式:
.*,
得到的结果却是:
this is a goverment, of the people,for the people,
因为贪婪模式将government后面的,也视为可匹配“.”。如何解决这个问题呢?
[^,]*,
.*?,
?的意思可理解为:到此为止,找到一个满足条件的就行!
非贪婪模式在找出引号括号等(文本中可能出现多个)界定中内容的时候非常有用。比如:找出本讲义前面若干段中()中的数据
([\s\S]*?)
@想一想@:用.代替[\s\S]和行不行?为什么?
(?=))
(?<=()
这就是所谓的零宽断言(什么鬼名字?^_^)注意其语法特点:
完整的写法:
(?<=()[\s\S]*?(?=))
可能你首先想到的正则是这样的:
(?<=a)\w+
但用文本
aside along apple banana
测试,你会发现anana也别匹配进来了。怎么办?
你想到了前面学的\b,于是你可能会使用:
\b(?<=a)\w+但这是不对的,正确的写法是:
(?<=\ba)\w+结论:零宽断言前后都不要再有其他表达式!
比如我们想找出一段文字
好好学习天天向上
中重复的叠声词(好好,天天)
\S\S
只能找出所有的两个汉字,“学习”和“向上”不能满足要求。这就必须使用分组的语法。
正则表达式中,用圆括号(())括起来一部分内容,这被称之为:捕获;
捕获的内容还可以被正则表达式使用,引用的方式是反斜杠+数字,这杯称之为:引用。
所以,上述要求正确的写法应该是:
(\S)\1
其中:
(\S)\1(\S)\2
注意:\1和\2的区别。
(?<name>\S)\k<name>注意:
I'm going to learn programing e.g. Java, C#, in 2021 when I am 23 years old. At that time, things will be different.里面的:
<h3 script ="onclick:function(){}"> 概念引入 </h3> <img src= '/picture.jpg' alt='源栈logo' /> <p style="color:red;"> 在程序中我们经常会遇到这样一种<strong>需求</strong>:当name="飞哥"时 </p>写出正则表达式,能匹配得到:
多快好省!前端后端,线上线下,名师精讲
更多了解 加: