特殊符号读音
@表示英语单词at,对可以上网的人来说是“在线”的意思;
$表示英语单词dollar,意思是美元,它是美元的符号;
&表示英语单词and,“和”的意思,相当于汉语中的连词.
^ caret [ˈkærət]
特别提示:正则表达式与文件通配语法无关,比如 *.xml
基础:
\b 单词的开头或者结尾, 匹配空格,换行,逗号,句号其中的某一个
. 匹配除了换行之外的任意一个字符.
* 前面的内容可以重复0次或者多次.
如: .* 匹配多个任意字符(完全没意义)
za* 匹配za zaa zaaaa z 等
a(za) 匹配 aza azaza azazazaza a 等
\d 匹配任意一位数组 0-9
\d{8} \d 这种类型的字符连续重复8次
\s 记得是小写s 匹配任意空白符 如 空格,制表符(tab),换行符,中文全角空格等
\w 也是小写w 匹配字母,数字,下划线,汉字
+ 匹配1个或者多个, *是0个或者多个,意义完全一样
^ 匹配字符串的开始
$ 匹配字符串的结束
> 关于 ^ 和 $ 被这两个字符包含的匹配条件, 要求输入的所有字符串必须满足我们的匹配条件, 而没有被这两个字符包含的匹配条件, 意思相当于在一个字符串中查找合法的字符串.
简单的来讲:
被包含:整个字符串必须满足匹配条件
没有被包含:整个字符串 中含有满足匹配条件的字符
字符转义: 如果我们就是要匹配这些特殊字符 如元字符 * , \ , . , ? ,等 我们需要转义字符. 就是给这些特殊字符前面加反斜杠\ 如 \* \\ \. \?
关于字符重复
* 0次或多次
+ 1次或者多次
? 1次或者0次
{n} n次
{n,} 大于等于n次
{n,m} 大于等于n次 或者小于定义m次
匹配指定字符
如匹配元音字母 a e i o u 为: [aeiou]
如匹配表达符号 . ? ! 为: [.?!]
匹配0-9中某个数组 为:[0-9] = \d
匹配a-z中某个字母 为:[a-z]
只要满足中括号[]中的字符的某一个就可以了
匹配电话号:
\(?0\d{2}[) -]?\d{8}
分析: \(? 左边小括号( 出现一次或者0次
0\d{} 0开头后面接两个数字
[) -]? ) 空格 和 - 中的一个 出现 1次或者 0次
\d{8} 连续8个数字
座机 其他匹配方法
0\d{2}-\d{8}|0\d{3}-\d{7}
匹配 三位区号 021-98767876
匹配 四位区号 0934-9876787
分支条件
可以用字符 | 创建分支条件,如 "条件1 | 条件2"
当满足条件1或者条件2时 匹配成功
注意:如果条件1和条件2同时满足,只匹配条件1, 从左到右匹配, 左边的条件满足后,不再管右边的条件.
例: 匹配美国邮政编码. 1. 可以是5位数字 2.可以是连字号间隔的9位数
正确写法: d{5}-d{4}|\d{5}
错误写法: d{5}|d{5}-d{4} 当要匹配的数字是大于 5 位 数字,小于8位数字时,这些数字都不是正确的邮编,但是他满足匹配条件 d{5}, 这里满足了条件d{5} 就不会再去验证 d{5}-d{4} 所以, 该写法是错误的
分组
用小括号包含的匹配字符可以当做一个整体(分组),可以对这个组加重复条件
如:匹配 ip 地址 (\d{1,3}\.){3}\d{1,3}
但是这个表达式也会匹配 256.300.888.999 这种非法ip
正确匹配ip: ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[]0-4)\d|25[0-5]|[01]?\d\d?)
反义: 查找不是某种类型的字符.
\W 大写的W , 是\w(小写)的反义词, 匹配任意不是字母,数字,下划线,汉字的字符
\S 大写的S , 是\s(小写)的反义词, 匹配任意不是空白符的字符
\D 大写的D , 是\d(小写)的反义词, 匹配非数字的字符
\B 大写的B , 是\b(小写)的反义词, 匹配不是开头或者结尾的字符
[^x] 匹配除了x 之外的任意字符
[^aeiou] 匹配除了 aeiou 这几个字母以外的任意字符
后向引用
每一个分组都有一个默认的组号,从左到右分别是 1, 2, 3, ...
如 \1 就是分组一的文本, \2 就是分组2的文本
如: \b(\w+)\b\s+\1\b 这里 \1=(\w+) 用来匹配重复单词 如: go go 或者 kitty kitty
指定组名: (?<组名>\w+) 或者 (?'组名'\w+)
要引用这个组,可以写: \k<组名>
上个例子可以写作: \b(?<Word>\w+)\b\s+\k<Word>\b 匹配重复数
零宽断言: 用于查找某些内容(不包括这些内容)之前或者之后的东西.用于指定一个位置
正先行断言: 在字符串相应位置之前进行查找匹配,使用(?=exp)匹配前面的位置.
(?=exp) 1.判断 exp 是否存在
2.如果存在,则 匹配exp 之前的位置
如:原始字符串: "abcgwcab"
正则: bc(?=gw)
结果: bc
解析: 首先查找 字符串 abcgwcab 中是否有 字符串 gw
有gw 则在gw 之前去匹配bc
反先行断言: 正好跟正先行断言相反, 断言 exp 前面匹配的字符在原始
字符串中后面的字符不是exp
(?!exp)
如:
原始字符:abcgwcab
正则: bc(?!ww)gw
结果: bcgw
解析: 先找到bc 看看bc后面的字符是gw != ww 所以满足条件, gw 正好和gw 匹配.
正后发断言: 在字符串 exp 位置之后进行匹配
(?<=exp)
如:
原始字符串: abcgwcab
正则: (?<=gw)ca
结果: ca
解析: 先找 gw 在不在, 然后匹配gw 后面是不是ca
反后发断言: 跟正后发断言相反 具体看事例
(?<!exp)
如:
原始字符串: abcgwcab
正则: (?<!bc)gw
结果:空
解析: 先查找gw 再看gw前面是不是bc 是bc 则返回空,不是bc则返回gw
- [正则表达式零宽断言](//www.greatytc.com/p/8c7f803d3f59)
- [正则表达式之零宽断言详解](http://blog.csdn.net/hsd2012/article/details/51272902)
注释:
语法: (?#commment) 如:2[0-4]\d(?#200-149)|25[0-5](?#250-259)|[01]?\d\d?(?#0-199)
(?<= # 断言要匹配的文本的前缀
<(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签)
) # 前缀结束
.* # 匹配任意文本
(?= # 断言要匹配的文本的后缀
<\/\1> # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
) # 后缀结束
贪婪和懒惰
贪婪: 一个正则表达式的行为匹配尽可能多的字符,如:
a.*b 会匹配最长的以a开始,以b结束的字符串. 用来搜索aabab 匹配结果是整个字符串 aabab , 称为贪婪匹配
懒惰: 匹配尽可能少的字符, 在任何限定符后面加上问好?,这就是懒惰匹配,如: a.*?b 意味着匹配任意数量的字符串,如果用来匹配 aabab 他会匹配 aab(第一道第三个字符)和ab(第四和第五个字符).
为什么先匹配的是 aab 而不是 ab 呢, 因为最先开始的匹配拥有最高的优先权.
*? 重复任意次, 但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或者1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}?重复n次以上, 但尽可能少重复
正则表达式
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 温馨提示:文章很长很长,保持耐心,必要时可以跳着看,当然用来查也是不错的。 正则啊,就像一座灯塔,当你在字符串的海...