首页 > 代码库 > 正则表达式 学习笔记

正则表达式 学习笔记

1、^

  字符串的起始位置

2、$

  字符串的结束位置

3、\b

  匹配单词的边界,但是不消耗任何一个字符串的位置,只是用来判断而已,比如:

  技术分享

4、\d

  数字

5、\D

  任意非数字

6、\w

  数字、字母、下划线

7、\W

  任意非数字、字母、下划线

8、\s

  空格

9、\S

  任意非空格

10、.

  匹配除换行符以外的任意字符

11、[abc]

  字符组,匹配括号里面存在的字符

12、*

  重复0次或多次

13、+

  重复一次或多次

14、?

  重复0次或1次

15、{n}

  重复n次

16、{n, m}

  重复n-m次

17、{n, }

  重复n到更多次

18、懒惰限定符

(1) *?

  重复任意次,但尽可能少重复 。如: "acbacb"  正则  "a.*?b" 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而"acbacb"最少字符的结果就是"acb" 

(2) +?

  重复1次或更多次,但尽可能的少重复。

(3) ??

  重复0次或1次,但尽可能少重复.如: "aaacb" 正则 "a.??b" 只会取到最后的三个字符"acb"

(4) {n,m}?

  重复n到m次,但尽可能少重复.如:"aaaaaaaa"  正则 "a{0,m}" 因为最少是0次所以取到结果为空

(5) {n,}?

  重复n次以上,但尽可能少重复.如:"aaaaaaa"  正则 "a{1,}" 最少是1次所以取到结果为 "a"

19、捕获分组

(1)分组 ()

  用()进行分组,对于分组来说,表达式永远是算作第一组,可以使用\1来向后引用,简化表达式,三十这里要注意,不能(\1),因为这样的话引用的是文本内容,而不是正则表达式,也就是说,当一个组中的内容匹配成功之后,向后引用,引用的就是匹配成功之后的内容,而不是表达式

(2)不捕获 ?:

  不捕获就是在分组的前面加上 ?: ,可以在不需要捕获分组的表达式中试用,加快表达式的执行速度。

(3)断言 (?<=)

  断言就是只某个字符串的前面或后面,将会出现满足某种规律的字符串,匹配的内容不包括断言的内容

  断言分为两种方式:

  《1》正后发断言    (?<=匹配的字符串)

  《2》正先行断言    (?=匹配的字符串)

  !表示正好相反的意思,就是把=换成了!,看表格解释,X代表字符

(?=X )

零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。
"How are you doing" 正则"(?<txt>.+(?=ing))" 这里取ing前所有的字符,并定义了一个捕获分组名字为 "txt" 而"txt"这个组里的值为"How are you do";

(?!X)

零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,\w+(?!\d) 与后不跟数字的单词匹配,而不与该数字匹配 。
"123abc" 正则 "\d{3}(?!\d)"匹配3位数字后非数字的结果

(?<=X)

零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。

"How are you doing" 正则"(?<txt>(?<=How).+)" 这里取"How"之后所有的字符,并定义了一个捕获分组名字为 "txt" 而"txt"这个组里的值为" are you doing";

(?<!X)

零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配

"abc123 " 正则 "(?<![0-9])123" 匹配"123"前面是非数字的结果也可写成"(?!<\d)123"

(4)捕获分组

  (exp)匹配exp,并捕获文本到自动命名的组里

  (?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号

  (?<name>exp)匹配exp,并捕获文本到名称为name的组里

 

正则表达式 学习笔记