本文目录:
- 1、正则表达式
- 2、正则表达式如何匹配多行的所有任意字符
- 3、正则表达式匹配HTML标签之间的内容
- 4、正则表达式 最小匹配(第一次出现) 2020-10-01
正则表达式
正则表达式(Regular Expression) 正则表达式是一种字符特征的描述方式,用来在文本中匹配到用户想要的东西.
正则表达式与通配符:
1.正则表达式一般用于处理文本内容,常用命令有grep,sed,awk,vim等
通配符一般用于匹配文件名,常用命令有find,ls,cp等
2.各符号的含义不尽相同.
什么地方使用正则表达式
vim grep sed awk nginx apache mail垃圾邮件过滤。。。 perl java python 等等都使用正则
构成
1.元字符(基本元字符、扩展元字符)
2.除元字符之外的任意字符都是表示他字面意思的正则表达式
正则表达式的匹配过程
正则表达式是按照从表达式最左端第一个字符开始,左到右依次一个一个字符进行匹配.当字符串中有字符成功匹配到正则表达式中字符,则从这个位置开始尝试正则表达式中的下一个字符进行匹配,如果匹配成功则继续从这个位置开始匹配正则表达式中下一个字符;如果匹配不成功,则“回溯”到第一次匹配的字符处重新从正则表达式中第一个字符开始匹配。
特征
贪婪匹配
基本元字符
1.字符匹配
** . 任意单个字符**
** [] []内的任意单个字符**
** [ a-z] 任意单个小写字母**
** [a-zA-z] [0-9] [a-zA-z0-9]**
[^0-9]除了数字外的任意当个字符
[a-z]小写字母
[0-9]数字
[A-Z]大写字母
[a-zA-Z]所有字母
[^a-zA-Z0-9]所有符号
次数匹配
** * 匹配前面的字符重复****0次****到多次 *
{****n****}****匹配前面的字符重复任意次数
{n,m}前面的字符重复n次到m次
{,n} 前面的字符最多重复n次
{n,} 前面的字符最少重复n次
** 位置匹配**
^ 行首
$ 行尾
词首
词尾
扩展元字符****Extended Metacharacters (egrep and awk)
sed -r
?? 前面的字符重复0次或1次
{} 次数匹配意义同基本元素中的{}
|或着
() 分组
\数字 引用分组的内容
前向: 在正则中引用
后向: 在其他地方引用, \0表示引用模式中所有的内容 \0 ⇔
hehello
llllo
llheo
hellhello
hellohello
编写正则表达式的3 个步骤****:
1 知道要匹配的内容以及它如何出现在文本中。
2 编写一个模式来描述要匹配的内容
3 测试模式来查看它匹配的内容,不能错,不能漏,不能多
练习: head /etc/passwd /tmp/pass
1. 删除每行的第一个字符
2. 在每行行首插入hello
3. 删除每行的第二个字符
4. 把每个数字用()括起来 如:(1)(2)
5. 把每个数值用()括起来 如:(12)
6. 删除每行的倒数第二个字符
7. 交换每行的第一个和最后一个字符
8. 删除刚好三个字符的单词
9. 把ro或da替换成A
思考:
1. 删除每行的第一个单词(纯字母)
2. 交换第一个和倒数第二个单词(纯字母)
POSIX字符类
点击这里点击这里
[:digit:]任何数字
[:xdigit:]任何十六进制数字
[:alpha:]任何字母
[:lower:]任何小写字母
[:upper:]任何大写字母
[:alnum:]任何字母或数字
[:cntrl:]ASCII控制字符(ASCII 0~31 和 ASCII 127)
[:punct:]不属于[:alnum:]和[:cntrl:]的任何字符
[:blank:]空格或制表符([\t ])
[:space:]任何空白字符,包括空格([\f\n\r\t\v ])
[:print:]任何可打印字符
[:graph:]同[:print:],但不包括空格
正则表达式如何匹配多行的所有任意字符
如何使用正则表达式来获取一段文本中的任意字符包括换行符“\n”呢?
匹配方法可以使用 ([\s\S]*) 或 ([\d\D]+) 或 ([\w\W]*)
其中*表示重复零次或更多次,+表示重复一次或更多次。
可以使用正则表达式在线测试工具验证,如下图:
正则表达式常用字符释义如下表:
正则表达式匹配HTML标签之间的内容
(?=)[^]+(?=)
假如html标签里面有一句:
String a = “style type=\”text/css\” div \n” +
“{ margin: 0; padding: 0; outline: 0; }/style”;
我如何把这一句取出来呢,包括标签。
用正则表达式:style([\\s\\S]*)/style
扩展资料:
正则表达式匹配HTML标签
方法一:
var str = ‘p class=”cha-309d-c131-6c72-8a91 odd” id=”odd”123/p’;
var pattern = /\/?[a-zA-Z]+(\s+[a-zA-Z]+=”.*”)*/g;
console.log(str.match(pattern));
方法二:
var str = ‘p class=”cha-c131-6c72-8a91-4421 odd” id=”odd”123/p’;
var pattern = /[^]+/g;
console.log(str.match(pattern));
方法三:
var str = ‘input type=”text” value=”” name=”username” /’;
var pattern = /(?:[^”‘]|”[^”]*”|'[^’]*’)*/g;
console.log(str.match(pattern));
说明:()表示捕获分组,()会把每个分组里的匹配的值保存起来,使用$n(n是一个数字,表示第n个捕获组的内容)
(?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来
没有引用的需求的话,采用非捕获性分组,更为简洁;
方法四:
var str = ‘input type=”text” value=”” name=”username” /’;
var pattern = /(?:[^”‘]|([“‘])[^”‘]*\1)*/g;
console.log(str.match(pattern));
/script
正则表达式 最小匹配(第一次出现) 2020-10-01
⮮因为需要使用Notepad++ 来过滤一些字符如下:
⮮首先按照字面的特征,写正则表达式如下:
\[.*\]\(https:.+\) ,测试匹配
⮮查阅Notepad++的在线帮助,找到正则表达式的相关内容:
When regex “.*” is run against the text “abc”x :
When regex “.*+” , with a possessive quantifier, is run against the text “abc”x :
Notice there is no match at all for the possive version, because the possessive repeat factor prevents from backtracking to a possible solution
⮮注意关键说明如下:
加入 *? 表示前一个字符出现0次或者无限多次,但是是 最小匹配 。结合刚才的需求分析:
⮮运行结果如下:
为什么呢?仔细分析正则表达式,原来问题出现在了前面:
前面的这个 \[.*\] 没有进行限定,依然是最大匹配,现在在这里也加上 ? ,看测试结果:
【正则表达式在线匹配】的内容来源于互联网,如引用不当,请联系我们修改。