正则表达式01
正则表达式教程
正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找和替换字符串中的模式。本教程将介绍正则表达式的基础知识和常用技巧。
1. 基本概念
正则表达式是由普通字符(如字母a-z)和特殊字符(称为"元字符")组成的文本模式。
2. 基本匹配
- 普通字符:匹配自身,如
a
匹配字母"a" - 特殊字符:需要转义才能匹配自身,如
\.
匹配点号
3. 常用元字符
字符类
.
- 匹配任意单个字符(除换行符外)[abc]
- 匹配a、b或c中的任意一个[^abc]
- 匹配除了a、b、c以外的任意字符
一些特殊需求
[\d] 只匹配 \ 和d两个字符
[[a] 匹配[ 时必须放到[之后
[a-] 匹配-时必须放到]之前
量词
*
- 匹配前一个元素0次或多次+
- 匹配前一个元素1次或多次?
- 匹配前一个元素0次或1次{n}
- 匹配前一个元素恰好n次{n,}
- 匹配前一个元素至少n次{n,m}
- 匹配前一个元素n到m次
位置锚点
^
- 匹配字符串的开始- $ - 匹配字符串的结束
\b
- 匹配单词边界\B
- 匹配非单词边界- \< - 表示一个单词的起始
- \> - 表示一个单词的结尾
分组和引用
( )
- 捕获分组(?: )
- 非捕获分组\n
- 引用第n个捕获组(n为数字)
选择
|
- 或操作,匹配左边或右边的表达式
元字符
元字符 | 描述 |
---|---|
\d | 匹配数字(等价于[0-9]) |
\D | 匹配非数字 |
\w | 匹配单词字符(字母、数字、下划线) |
\W | 匹配非单词字符 |
\s | 匹配空白字符(空格、制表符、换行符等) |
\S | 匹配非空白字符 |
POSIX 字符类
POSIX字符类 | 描述 | 字符 | ||
---|---|---|---|---|
[:alnum:] | 所有的字母和数字 | == [:word:] == [a-zA-Z0-9] | ||
[:word:] | 同[:alnum:] | |||
[:alpha:] | 所有的字母 | == [a-zA-Z] | ||
[:blank:] | 所有呈水平排列的空白字符 | 空格、制表符 | ||
[:cntrl:] | 所有的控制字符 | [\x00-\x1F\x7F] | ||
[:digit:] | 所有的数字 | |||
[:graph:] | 所有的可打印字符,非空格、控制字符 | [\x21-\x7E] '[:alnum:]' and '[:punct:]' | ||
[:lower:] | 所有的小写字母 | |||
[:print:] | 所有的可打印字符,包括空格 | '[:alnum:]', '[:punct:]', and space. | ||
[:punct:] | 所有的标点字符 | ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` ~ { } ~ \ | ||
[:space:] | 所有呈水平或垂直排列的空白字符(新行,空格,制表符) | |||
[:upper:] | 所有的大写字母 | |||
[:xdigit:] | 所有的十六进制数 | [A-Fa-f0-9] | ||
[:ASCII:] | ASCII集合 | == [\x00-\x7F] |
实际使用: [[:alnum:]] #需要两个[[]]
[^[:alnum:]] #取反
4. 高级特性
贪婪与懒惰匹配
默认是贪婪的,在量词后加?变为懒惰
.*
- 贪婪匹配.*?
- 懒惰匹配
零宽断言
(?=exp)
- 正向前瞻(?!exp)
- 负向前瞻(?<=exp)
- 正向后顾(?<!exp)
- 负向后顾
1. 零宽度正预测先行断言(?=exp), 所取字符串后匹配exp
断言自身出现的位置的后面能匹配表达式exp。
\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),
如查找I'm singing while you're dancing.时,它会匹配sing和danc。
# echo "I'm singing while you're dancing."|grep -Po '\b\w+(?=ing\b)'
sing
danc
2. 零宽度正回顾后发断言(?<=exp) , 所取字符串后匹配exp
断言自身出现的位置的前面能匹配表达式exp。
(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),
如在查找reading a book时,它匹配ading。
3. 零宽度负预测先行断言(?!exp)
断言此位置的后面不能匹配表达式exp
\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;
\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词
4. 零宽度负回顾后发断言(?<!exp)
断言此位置的前面不能匹配表达式exp
(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。