正则表达式简单用法
2016-01-24 15:31
281 查看
1. 正则语法
1.1 基本元字符
元字符 | 含义 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意空白符 (Space Tab) |
\d | 匹配数字 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
1.2 重复
元字符 | 含义 |
---|---|
* | 零次或更多次 |
+ | 一次或更多次 |
? | 零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
1.3 字符集合
当查找字母,数字,空白时,直接使用元字符即可。但如果要匹配特定的字符集,这时就需要字符集合。
[afox]匹配afox中任意一个字符
[^afo]不匹配afo中的任意一个字符
[a-c0-2]等价于
[abc012]
1.4 分支
类似于C++中的a || b表达式,
a或
b任意一个为真,则表达式为真。
0\d{3}|1\d{2}匹配以0开头的四个数字 或者 以1开头的3个数字。
|用来表示分支操作。
1.5 分组
分组用于重复匹配。比如IP地址192.168.4.2, 简单的正则表达式:
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}。可见表达式中重复出现
\d{1,3}\.,此时可以采用分组。
(\d{1,3}\.){3}\d{1,3}。
说白了,就是重构。提取重复代码,构造一个公共函数,进行调用。
1.6 反义
不匹配特定字符。元字符 | 含义 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意非空白字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配任意不是单词开头或结束的位置 |
[^a] | 匹配除a以外的任意字符 |
1.7 后向引用
后向引用: 正则表达式前面匹配一个字符串,在表示的后面部分进一步处理。表达式前面的匹配称为捕获,使用小括号。the the --------------------------------------- grep -P "\b(\w+)\b\s+\1\b" --color text the the
捕获:
()通过添加小括号,对数据进行捕获。
引用:
\1引用捕获的内容, 1表示第一个小括号捕获的内容,如果有多个捕获,从左到右依次编号。
1.8 零宽断言
用于查找某些内容(但不包含这些内容)之前或者之后的内容。比如singing, 匹配ing之前的内容sing。
表达式 | 含义 |
---|---|
(?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 |
singing singingd ------------------------------------- grep -P "\b\w+(?=ing\b)" --color text singing
1.9 贪婪与懒惰
正则表达式很勤快,也称为贪婪,总是最长匹配。例如:a.*b会匹配字符串
axbxxxb。但如果只想匹配
axb,这时需要懒惰匹配,表达式
a.*?b。
表达式 | 含义 |
---|---|
*? | 重复任意次,但尽可能少 |
+? | 重复1次或更多次,但尽可能少 |
?? | 重复0次或1次,但尽可能少 |
{n,m}? | 重复n到m次,但尽可能少 |
{n,}? | 重复n次以上,但尽可能少 |
2. 正则历史
2.1 PCRE 与 POSIX
2.1.1 PCRE 与 POSIX 区别
正则语法 中所描述的各种使用范例,都是PCRE(Perl Compatible Regular Expressions)流派的使用方法。而在Unix/Linux 世界中,还存在另一流派,即
POSIX规范。
区别
-
POSIX不支持懒惰匹配
-
POSIX不支持
\d,
\D,
\s,
\S,
\w,
\W
-
POSIX不支持零宽断言
字符组
POSIX虽然不支持
\d,
\s等元字符,但其引入字符组概念。
[:digit:] 匹配数字,等同
\d
[:alpha:] 匹配字母,等同
[a-zA-z]
[:lower:] 匹配小写,等同
[a-z]
[:upper:] 匹配大写,等同
[A-Z]
[:space:] 匹配空白,等同
\s
栗子
234 匹配以数字2开头的三个数字 grep -E "2[[:digit:]]{2}" --color text 2e 匹配以数字2开头的非数字 grep -E "2[^[:digit:]]" --color text 后向引用, 匹配 the the grep "\b\([a-z]\+\)\b\s\+\1" --color text
NOTE: 参照http://www.greenend.org.uk/rjk/tech/regexp.html
2.1.2 BRE 与 ERE 区别
POSIX 正则,又分为BRE(Basic Regular Expressions 与
ERE(Extended Regular Expressions)两个流派。
BRE元字符
?,
+,
{,
|,
(,
)丢失特殊含义,成为普通字符。使用其特殊含义,需要
\进行转义,即
\?,
\+,
\{,
|,
\(,
\)。
BRE不支持分支。
NOTE: Grep 有4个参数,-G 代表BRE,-E 代表ERE, -F 代表PCRE, -F 普通文本。
2.2 VIM Magic
VIM Magic 设计初衷:更容易的构造正则表达式。支持pcre的元字符\d,
\s,
\w等。但却没有给
+,
?,
(),
{}赋予特殊含义。这样
Vim Magic模式既有
PCRE语法,又有
POSIX语法,导致字符转义规则比较混乱。
\v除下划线, 大小写字母,数字外,全为特殊字符
\V只有
\有特殊含义
case --------------------- 2x23 2x7{2} 2.7{2} Magic 模式 --------------------- 2.\d{2}$ 匹配 2x7{2} \v 模式 --------------------- 2.\d{2}$ 匹配 2x23 \V 模式 --------------------- 2.\d{2}$ 匹配 2.7{2}
NOTE:
① 使用vim时,显示使用
v与
V, 避免magic模式的模糊不清。
② vim 中,单词界定符为
\<,
\>。
相关文章推荐
- 7种形式的Android Dialog使用实例
- 2014年第五届蓝桥杯C/C++程序设计本科B组省赛 史丰收速算(代码填空)
- Android: 调用LayoutInflater方法时warning和exception
- js判断数据类型
- HMM学习笔记—002--维特比算法(viterbi algorithm)
- Spring IoC 学习 ——ApplicationContext 与 DispatcherServlet
- NSDate 的一些操作(比较、创建、在现有date加减一定时间等)
- 高级特性(7)- 高级AWT
- file_get_contents是打工文件或URL获取内容的方法,比其稳定的还有curl_get_contents
- 逆波兰表达式题解
- androidUI控件
- 两次访问同一静态URL得到的文件长度不一样
- Ubuntu 64位adb无法使用问题的解决
- POJ2531-Network Saboteur-暴力枚举+记忆化/dfs/随机化乱搞
- android 基础知识点(面试准备)
- 【Redis笔记(四)】 Redis数据结构 - list链表
- SpringMVC接收json数据中的一些问题(415错误的解决)
- 构造,析构,覆盖,重载,隐藏
- A Primer on Open-Source NoSQL Databases
- 【源】从零自学Hadoop(10):Hadoop1.x与Hadoop2.x