正则表达式

微博,朋友圈常用正则匹配

1
2
3
4
5
6
7
8
匹配粗体中括号间的内容(也带上两边的粗体中括号)
【[^】]+】

匹配粗体中括号间的内容(不带两边的粗体中括号)的正则表达式:
(?<=【)([^】]+)(?=】)

匹配书名号之间的内容(不带两边的书名号)的正则表达式:
(?<=《)([^》]+)(?=》)
1
2
3
4
5
6
7
(?<=xxx)是以xxx开头的字符串, 但不包含xxx本身。

(?=xxx)就匹配以xxx结尾的字符串, 但不包含xxx本身。

(?<=《)即以《开头, 但不包含《

(?=》)即以》结尾,但不包含》

转义字符

1
正斜杠(/)与反斜杠(\)
转义序列 字符
\’ 单引号
\” 双引号
\ 反斜杠
\0
\a 警告
\b 退格
\f 换页
\n 换行
\r 加车
\t 水平制表符
\v 垂直制表符

正斜杠/,网址、Url地址。

正则表达式-问号的用法

1、匹配问号

因为?在正则表达式中有特殊的含义,所以如果想匹配?本身,则需要转义,\?

2、有无量词

问号可以表示重复前面内容的0次或一次,也就是要么不出现,要么出现一次。

3、贪婪\非贪婪匹配

在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

示例:匹配字符串abcabcabc

1
2
a.*c     结果:abcabcabc
a.*c 结果:abc

4、 预见匹配

简单说,就是匹配时考虑预见匹配的那一部分,不符合的不能算匹配上,但匹配的结果部分(变量$&)要除去预见匹配部分,又分两种。

1)肯定预见匹配 /pattern(?=string)/;匹配时,要考虑符合string

遇见功能,”?=”,意识说目标串中肯定存在什么,比如:

1
2
3
var str="ab45555";
正则 ab(?=\d)
结果: ab(yes)

2 否定预见匹配 /pattern(?!string)/;匹配时,要考虑不符合string的才行,结果$&仍然只是取patern部分,不包括string
“?!”,意思说目标串中不应该存在什么var str=”ab1”;

1
2
3
4
5
6
7
var str="ab45555";
正则 ab(?!\d)
//结果为false

var str="abccc";
//结果为 ab(yes)
意思是目标串中的第三位不应该是数字

(?=p) :零宽正向先行断言,要求接下来的字符串都与 p 匹配,但不能包含匹配 p 的那些字符

(?!p) :零宽负向先行断言,要求接下来的字符串不与 p 匹配

(出自《JavaScript权威指南》)

1
2
3
4
5
6
7
8
(?<=xxx)是以xxx开头的字符串, 但不包含xxx本身。  
(?=xxx)就匹配以xxx结尾的字符串, 但不包含xxx本身。
(?!xxx)就匹配不以xxx结尾的字符串, 但不包含xxx本身

匹配内容 abccdd
正则 (?<=ab)[a-z]*(?=dd)
输出:cc
解释:1、(?<=ab)以ab开头 2、[a-z]* a到z重复任意次 3、(?=dd) 以dd结尾

几个常用的非贪婪匹配Pattern

1
2
3
4
5
- *? 重复任意次,但尽可能少重复
- +? 重复1次或更多次,但尽可能少重复
- ?? 重复0次或1次,但尽可能少重复
- {n,m}? 重复n到m次,但尽可能少重复
- {n,}? 重复n次以上,但尽可能少重复

示例

1
2
3
4
5
6
7
#([^@]+?)#   #不以@开头字符重复1次或更多#
话题 (例如#奇葩说#哈哈#天天向上#节目):
\[([^\[]*?)]
表情 (例如[哈哈]and[呵呵]):

At (例如 @王思聪 ):
@([\x{4e00}-\x{9fa5}A-Za-z0-9_\-]+)

正则表达式基本语法

1、正则表达式常见字符

1
2
3
4
5
6
test            # 匹配包含test的字符串
. # 匹配除换行符外任意字符
\ # 转义字符
[abc]或[a-c] # 匹配字符类,如例子匹配a,b,c中的任何一个
[^x] # 匹配除了x以外的任意字符
[^abc] # 匹配除了a,b,c以外的所有字符

2、正则表达式特殊字符

1
2
3
4
5
6
\d                  # 数字,等同于[0-9]
\D # 非数字
\s # 空白字符(包括换行、Tab等)
\S # 非空白字符
\w # 单词,等用于[a-zA-Z0-9_]
\W # 非单词

3、正则表达式数量词(重复)

贪婪量词*+
惰性(非贪婪)(最少重复匹配)量词?

1
2
3
4
5
c*                  # 匹配字符"c" 0或无限次    	*=重复0次或更多次
c+ # 匹配字符"c" 1次以上 +=重复1次或更多次
c? # 匹配字符"c" 0或1次 ?=重复0次或1次
c{3} # 匹配字符"c" 3次 {n}=重复n次
c{3,5} # 匹配字符"c" 3到5次 {n,m}=重复n到m次

4、正则表达式逻辑或分组

1
2
3
4
c|b                 # 匹配"c"或"b"
(ab|cd) # 匹配"ab"或"cd"
(?P<name>abc) # 匹配"abc"并命名为name
(?P=name) # 前文中的name组

5、定位点(锚字符、边界)

^ 匹配开始的位置。将 ^ 用作括号[]表达式中的第一个字符,则会对字符集求反。
$ 匹配结尾的位置。
\b 与一个字边界匹配,如er\b 与“never”中的“er”匹配,但与“verb”中的“er”不匹配。
\B 非边界字匹配。

正则在OC中,在遇到\d\.等情况需要转义 \\d\\.

1
2
3
4
5
6
7
8
9
10
匹配手机号--手机号以13,14-18开头,9个 \d 数字字符
单独字符串验证 # ^1[34578]\d{9}$
全文匹配 # 1[34578]\d{9}
用户名(英文+数字) # ^[A-Za-z0-9]{6,20}+$
密码 # ^[a-zA-Z0-9]{6,20}+$
昵称 # ^[u4e00-u9fa5]{4,8}$
QQ号 # [1-9][0-9]{4,14}
@用户名 # @\w+ 或 @[\u4e00-\u9fa5a-zA-Z0-9_-]{2,30} 或@[0-9a-zA-Z\\u4e00-\\u9fa5]+
#话题# # #[^#]+#
标签<id>content</id>中间的内容 # (?<=<id>).*?(?=</id>)

注意

1
2
3
1. \w 匹配包括下划线的任何单词字符,但不包含标点符号如',',它等价于[A-Za-z0-9_];(也即字母,数字,下划线)
2. [\w,]除了能匹配\w能匹配的所有单词字符外,还能匹配',', 它等价于[A-Za-z0-9_,];
3. [\w-] 除了能匹配\w能匹配的所有单词字符外,还能匹配',',常见于匹配URL链接

示例

1
2
^[\u4e00-\u9fa5]{0,}$   全中文

正则工具

http://regex.zjmainstay.cn/

http://regexr.com/

https://regex101.com/

http://myregexp.com/

https://www.debuggex.com/

https://www.regextester.com/ 正则错误有提示

可视化,用来验证正则是否正确

https://jex.im/regulex/

https://www.regexplanet.com/support/similar.html

生成代码

http://tools.guardui.net/regex/create_reg.html

参考

https://github.com/aloisdg/awesome-regex

http://www.jianshu.com/p/cca5519a9367

http://www.cnblogs.com/hustskyking/archive/2014/01/18/how-regular-expressions-work.html

https://www.qcloud.com/community/article/675364001489391659?fromSource=gwzcw.92887.92887.92887

https://www.zhihu.com/question/48219401

iOS开发——正则表达式验证手机号、密码

iOS 正则匹配手机号和固定电话

正则表达式理论篇

正则表达式实践篇

http://www.jb51.net/tools/regex.htm

[正则表达式\w]+,\w+,[\w+] 三者区别? [],[ABC]+,[\w./-]+ 表达什么?

mozilla正则表达式

escapeRegExp

https://stackoverflow.com/questions/3809401/what-is-a-good-regular-expression-to-match-a-url

https://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript

https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex

文章作者: kyren
文章链接: http://huluo666.github.io/2016/09/04/正则表达式/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Kyren's Blog