博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式基础
阅读量:5049 次
发布时间:2019-06-12

本文共 2220 字,大约阅读时间需要 7 分钟。

元字符
正则表达式12个元字符:
$()*+.?[\^{|
注意:没有
] } -  ]} 只有在前面使用了{[才和它成对匹对。其他地方都认为是字面文本。
 
转义:正则表达式的元字符转义只是在前面加斜杠\ 。如果有一段元字符要转移。可以使用 \Q......\E进行转义。 \Q 和\E 之前的字符会被当做字面文本来对待。
 
不区分大小写:(?i)  (?i)和(?-i)之间的字符不区分大小写。
(?i)[A-F0-9]
不可打印字符,可以通过十六进制匹配
\a 振铃 0x07
\e 转义 0x1B
\f 换页 0x0C
\n 换行 0x0A
\r 回车  0x0D
\t 水平制表符 0x09
\v 垂直制表符 0x0B
 
匹配多个字符之一
c[abc]g   c[a-f]g  c[1-9]g
匹配数字和字母 [a-zA-Z0-9]
反向是不被允许的,如[z-a]
 
简写
\d [\d] 匹配单个数字
\D [^\d] 匹配不是数字的任意字符
\w 匹配单个单词字符
\s 匹配任意的空白字符 。包括空格,制表符和换行符。
\S 匹配\s不能匹配的任意字符
 
匹配任意字符
点号 .  匹配任意字符。点号只匹配单个字符。
[\s\S]  匹配任意字符
如果正则表达式无法启用点号匹配换行符。在点号前面加上模式修饰符。(?s)'.' 
 
匹配起始位置 结束位置
^ 起始位置 如以begin开头  ^begin  或者 \Abegin 
$ 结束为止  以end结尾  end$  或者 end\Z end\z
^ $ \A \Z \z 称为定位符。他们不匹配任意字符。只匹配特定位置。
匹配空白行: ^$
 
匹配完整单词
单词边界 \b ,匹配一个单词的开始和结束。
例如:jia.txt  
My cat is brown
category
wecatwe
bobcat
CAT
good cat
匹配出cat 。 cat  jia.txt  |grep -E '\bcat\b
非单词边界 \B 匹配目标文件中\b不匹配的位置:
匹配cat,但不是开头:
cat jia.txt  |grep -E '\Bcat'
wecatwe
bobcat 
匹配cat,但不是结尾:
cat jia.txt  |grep -E 'cat\B'
category
wecatwe
匹配cat,cat在单词中:
cat jia.txt  |grep -E '\Bcat\B'
wecatwe
 
匹配多个选择分支之一
| 管道    one|two|three
完整匹配分支中的单词 \b(one|two|three)\b
 
分组和捕获匹配
分组是通过圆括号来实现的()
例如:
echo "my name is zeng" |grep -E 'nan|zen'
echo "my name is zeng" |grep -E '\b(nan|zen)\b'
说明:选择分支nan匹配成功(圆括号内具有最高优先级,最先执行。)接着引擎退出改分组,匹配\b 失败。
echo "my name is zeng" |grep -E '\b(nan|zeng)\b' 是能匹配成功的。说明zen在\b匹配失败后,再次进入分支匹配。
 
非捕获分组:
(?: 开始 结束)
在计算捕获分组的左括号来确定序号的时候,不会计算非捕获分组的括号,性能更好。但不会记录分组的后的内容太。以上可以写为:
echo "my name is zeng" |grep -E '\b(?: nan|zeng)\b'
捕获分组见【再次匹配先前匹配过的文本】来理解。
 
带模式修饰符的分组
例如:
gooD(?i:one|WO|NAME) 在()内的内容就成了大小写不敏感。
 
再次匹配先前匹配过的文本
例如:我们想找出一个日期。年的后两位和日月相同。如20
08-08-08 20
09-09-09
\b\d\d(\d\d)-
\1-\1\b
\b 表示单词定界符
\d表示匹配数值。
(\d\d)先把年的后两位做分组。
\1 表示匹配第一个分组
正则表达式在一个完整的单词里面捕获到(\d\d)分组保存到1号捕获分组。接着匹配-。接着1号分组。。。。
 
捕获和命名匹配子串
把捕获到的匹配子串分别保存到对应名称。
例如:
\b(?<year>\d\d\d\d)-(?<month>\d\d)-(?<day>\d\d)
把年月日分别存储在 year month day的子串中。而不是默认的1 2 3 。
 
把正则表达式的一部分重复多次
{n} 重复之前表达式n次
{n,m} 重复n到m次
{1,} 至少1次以上
{0,} 至少0次以上
\d{100} 重复数字100次
\b[a-f0-9]{1,8}\b 十六进制整数 
 
正则表达式的注释
例如日期:
1、宽松排列语法:
(?x)\d4 #year
-         #separator
\d{2}   #month
-         #separator
\d{2}         #separator
2、(?#comment) 注释方法:
(?#year)\d{4}(?#separator)-(?#month)\d{2}-(?#day)\d{2}
(?x) 放在正则表达式的最开始地方。确保 (?x) 之前不存在任何空格。

转载于:https://www.cnblogs.com/vansky/p/9511219.html

你可能感兴趣的文章
Spring Cloud微服务笔记(五)Feign
查看>>
C语言键盘按键列表
查看>>
Codeforces Round #374 (Div. 2)
查看>>
oracle数据类型
查看>>
socket
查看>>
Vue中使用key的作用
查看>>
二叉索引树 树状数组
查看>>
日志框架--(一)基础篇
查看>>
Java设计模式之原型模式
查看>>
Spring学习(四)-----Spring Bean引用同xml和不同xml bean的例子
查看>>
哲理故事与管理之道(20)-用危机激励下属
查看>>
关于源程序到可运行程序的过程
查看>>
wepy的使用
查看>>
转载:mysql数据库密码忘记找回方法
查看>>
scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
查看>>
面向对象1
查看>>
在ns2.35中添加myevalvid框架
查看>>
【贪心+DFS】D. Field expansion
查看>>
为什么要使用href=”javascript:void(0);”
查看>>
二进制文件的查看和编辑
查看>>