文档章节

分分钟使用正则表达式

芳仔小脚丫
 芳仔小脚丫
发布于 2015/05/14 19:29
字数 1446
阅读 1058
收藏 72

#什么是正则表达式 从概念上来说,正则表达式也是一门小巧而精炼的语言,它可以用来简化检索特定的字符串,替换特定字符等功能,有许多开发语言工具,都内嵌支持正则表达式。那么一个正则表达式,究竟是什么?其实它就是一个字符串,但这个字符串具有特定含义。

基础语法

字面值

所谓字面值,就是没有任何转义,查找的对象就是其本身,比如正则表达式 abc ,查找的结果就是返回要查找字符串中 a, b, c三个字母连在一起的字符串。又如,123 就是查找到 123 这个子串。

特殊字符

句号

.在正则表达式中表示匹配任意字符,很相似于通配符*。如果我们查找a.b这个正则表达式,我们可以找到所有开头和结尾为a,b,中间是任意字符的字符串,比如abc,adc,a2c等。

字符类([])

如果你在一个正则表达式中看到有一些字符被[]括号括起来,那么他们的含义将不再是简单的字面值,他们表示某一个被括号中属性约束的字符。比如**[123456],这个正则表达式表示找到1-6中的任意一个字符,又比如a[bd]c**,这表示查找abc或者adc

注意:

  • 在字符类中字符的顺序和重复性都不是我们关心的。[123]和[2233111],含义是一模一样的。
  • 句号在字符类中表示的就是其本身,[.]就是查找一个句号。

区间符号(-)

如果我们需要查找一个数字,[0123456789],这样做是可以达到目的的,但这写起非常麻烦,并不符合正则表达式小巧的特性,这时我们可以使用区间符号来简化,[0-9]和上面的式子意义完全一样。同样,我们可以[a-zA-Z],表示任意一个字母。

注意:

  • 区间的范围应该有意义,**[a-1]**这样的区间并无任何意义,尽管它在语法上可能没有错误;
  • 区间左右两端对应的是字符,并不是数字,比如**[2-41]**,这个式子的含义是找到2-4的一个数字或者1,和[1-4]是一样的。

取反符号(^)

^在正则表达式中表示取反,这个很好理解,[^a],表示找到除了a之外的任意字符。[^0-9],表示找到一个非数字的字符。

注意:

  • ^必须在中括号内,及字符类属性中使用。
  • ^是将后面的整体作为取反条件的。

简化的字符类

某些符号具有和字符类相同的含义:

  • \d和**[0-9]**相同
  • \w和**[0-9A-Za-z_]**相同 表示
  • 数字,字母或者下划线**\s
  • **表示匹配空格,tab和换行等不可见符。

与此相对的\D,\W,\S,则表示上述条件的取反情况。

乘法集({})

乘法集的最大用处也是简化正则表达式,用大括号表示。比如,a{2},表示找到 aa 这个字符串。

注意:

乘法集是已前面整体为乘法条件的,比如 [ab]{2},不是简单的比配aa,bb,而是和[ab][ab]含义是相同的,会匹配ab,ba,aa,bb。

乘法集中的区间(,)

乘法集和字符类相同,也可以用区间进行简化,但是符号不相同。a{1,3},表示找到a,aa,aaa这三个字符串。a{0,1}是合法的,表示找到空字符,或者a。

注意:

  • 乘法集的"越长越好"属性:乘法集具有这样的特点,比如a{2,4},如果我搜索myaaaa,它不会找到aa后就停止,而是会找到aaaa
  • 乘法集的"全部获取"属性:比如 a{2.4},如果搜索 myaayouaaaa,它会找到 aaaaaa
  • 乘法集支持开区间,a{1,} 是合法的,表示找到任何 a 相连的字符串。

判断符号(?)

这个符号的含义和 {0,1} 完全相同,123?4,表示匹配 1234 或者 124

###统配符号(*)

这个符号的含义和 {0,} 相同,比如.* 表示通配一切字符串。

+符号

这个符号和{1,}相同。

或符号(|)

|符号表示或的关系,比如 abc|edf,表示找到 abc 或者 def ;

组合(())

小括号在正则表达式中表示组合,比如**(a|b|c)d**,表示找到ad, bd, cd,可以将小括号的作用理解为优先级。

单词边界(\b)

\b 表示单词的边界,比如 \b[a-z]{3}\b ,表示匹配一个三个字母的小写单词。

行边界(^ $)

单单的一个^符号表示的是行的开头,$表示行的结束。

注意:

  • [^]是非法的,[$]表示匹配一个$符号。

##做些小总结

上面说了这么多正则表达式的语法规则,我们现在来做下总结:

几个概念:

  • 字面值:直接查找的字符,比如123, avb。
  • 字符类:描述字符的一些属性,比如[123], [a-z], \d, \w, \s, . 。
  • 乘法集:简化表达式,比如 {0,3}, ?, +, *。
  • 或和组合:比如(a|b|v)。
  • 单词,行的边界\b ^ $

元字符列表

. \ [ ] { } ? * + | ( ) ^ $

3、字符类中元字符列表

[ ] \ - ^

一个特别重要的字符

最后,还有一个特别特别重要的字符我们没考虑到,如果我们要查找元字符怎么办,在正则表达式中还有一个转义字符"",如果我们要查找. 只要查找 \. 同理\[\]是查找"[]"这个字符串。如果要查找"",再加一个转义字符就好:\\

本文转载自:http://my.oschina.net/u/2340880/blog/403508?p=1#rpl_286038160

芳仔小脚丫
粉丝 930
博文 83
码字总数 76301
作品 0
闵行
程序员
私信 提问
加载中

评论(5)

l
lvbaogang
79
么么001
简化的字符类:
数字,字母或者下划线**\s
表示匹配空格,tab**和换行等不可见符。
请问这一些是什么意思?
临峰不畏
临峰不畏
赞!
前沿网络工作室
前沿网络工作室
[色]
阿发摇滚
79精简,有用
聊一聊正则表达式,最全最常用总结

日常开发文本处理过程中,简单的Ctro+H模式(一对一替换模式)已经不能满足需要了我们需要更为强大的文字处理工具,正则于是应运而生。很多小伙伴不怎么太懂正则。比如我们用到的最多的就是注...

2017/12/26
0
0
ImgLikeOpera

ImgLikeOpera 可以让你在使用 Firefox 浏览网页时仅载入你需要的图片。这个扩展很适合非宽带用户使用。 功能: - 将图片替换为占位符而不载入图片; - 从快捷菜单(重新)载入图片或者使用快捷键...

匿名
2008/09/19
1K
0
有大量的正则表达式,挨个匹配每条数据,hadoop效率特别低?

有大量的正则表达式,去挨个匹配每一条数据,效率特别低,几万数据要十几分钟 有什么方式去快速匹配处理? 正则是类似这种大量的yaml格式数据 对象 处理规则成为RulePattern对象 RulePatter...

灰狗
2018/07/11
452
2
关于Logstash中grok插件的正则表达式例子

关于Logstash中grok插件的正则表达式例子 一、前言 近期需要对产生的日志进行采集,问了下度娘,业内最著名的解决方案非(, , )莫属。 负责采集日志,负责存储、索引日志,则负责通过Web形式展...

xianglc5474
2016/12/16
92
0
JavaScript 函数replace揭秘

在JavaScript中replace函数作为字符串替换函数,这是一个威力强大的字符串操作函数,对于常见字符串操作的推荐用法。这篇随笔就来更加深入的理解它。 replace函数接受两个参数,第一个参数为字...

豆花饭烧土豆
2016/07/21
2
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
8
0
多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
昨天
2
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部