什么是正则表达式

描述

  • 正则表达式(简称为regex)是一些由字符和特殊符号组成的字符串
  • 能按照某种模式匹配一系列有相似的字符串
    • 例如:[a – z]表示26个小写英文字母
    • 例如:[A – Z]表示26个大写英文字母

正则表达式中的符号

符号 描述 示例
literal 匹配文本字符串的字面值literal foo
re1|re2 匹配正则表达式re1或者re2 foo|bar
. 匹配任何字符串(除了\n之外) b.b
^ 匹配字符串起始部分 ^Dear
$ 匹配字符串终止部分 /bin/*sh$
* 匹配0次或者多次前面出现的正则表达式 [A-Za-z0-9]*
+ 匹配1次或者多次前面出现的正则表达式 [a-z]+\.com
? 匹配0次或者1次前面出现的正则表达式 goo?
{N} 匹配N次前面出现的正则表达式 [0-9]{3}
{M,N} 匹配M~N次前面出现的正则表达式 [0-9]{5,9}
[…] 匹配来自字符集的任意单一字符 [aeiou]
[..x-y..] 匹配x~y范围中的任意单一字符 [0-9], [A-Za-Z]
[^…] 不匹配此字符集中出现的任何一个字符,包括某一范围的字符(如果在此字符集中出现 [^aeiou], [^A-Za-z0-9]
(*|+|?|{})? 用于匹配上面频繁出现/重复出现符号的非贪婪版文(*、+、?、{}) .*?[a-z]
(…) 匹配封闭的正则表达式,然后另存为子组 ([0-9]{3}?,f(oo|u)bar

 

正则表达式中的特殊字符

特殊字符 描述 示例
\d 匹配任何十进制数字,与[0-9]一致(\D与\d相反,不匹配任何非数值型的数字) data\d+.txt
\w 匹配任何字母数字字符,与[A-Za-z0-9_]相同(\W与之相反) [A-Za-z_]\w+
\s 匹配任何空格字符,与[\n\t\r\v\f]相同(\S与之相反) of\sthe
\b 匹配任何单词边界(\B与之相反) \bThe\b
\N 匹配已保存的子组N(参见上面的(…)) price:\16
\c 逐字匹配任何特殊字符c(即,仅按照字面意义匹配,不匹配特殊含义) \., \\, \*
\A(\Z) 匹配字符串的起始(结束)(另见上面介绍的^和¥) \ADear

 

正则表达式中的扩展表示法

扩展表示法 描述 示例
(?iLmsux) 在正则表达式中嵌入一个或者多个特殊“标记”参数(或者通过函数/方法) (?x) ,  (?  im)
(?….) 表示一个匹配不用保存的分组 (?:\w+\.)*
(?P<name>…) 像一个仅由name标识而不是数字 ID 标识的正则分组匹配 (?P<data>)
(?P=name) 在同一字符串中匹配由(?P<name)分组的之前文本 (?P=data)
(?#…) 表示注释,所有内容都被忽略 (?=comment)
(?=… 匹配条件是如果…出现在之后的位置,而不使用输入字符串:称作正向前视断言 (?=.com)
(?!…) 匹配条件是如果…不出现之后的位置,而不使用输入字符串,称作负向前视断言 (?!.net)
(?<=…) 匹配条件是如果…出现在之前的位置,而不使用输入字符串;称作正向后视断言 (?<=800-)
(?<!…) 匹配条件是如果…不出现在之前的位置,而不使用输入字符串;称作负相后视断言 (?<!192\.168\.)
(?(id/name)Y|N) 如果分组所提供的id或者name(名称)存在,就返回正则表达式的条件匹配Y,如果不存在,就返回N;|N是可选项 (?(1)y|x)

 

正则表达匹配同类型及边界匹配

使用正则表达式

简单匹配:例如:abc => abc
多个匹配模式:例如:abc|12c => abc, 12c
匹配任意字符(.),除\n之外:例如:. =>abc, 12c


*匹配0次或者多次:
例如:a*bc
aabcd => aabc
cbc => bc

+匹配一次或者多次
例如:a+bc
aabcd => aabc
cbc => 

?匹配0次或者1次
例如:a?bc
aabcd => abc
cbc => bc

{N}匹配指定的N次
例如:a{3}
aaaabc => aaa
aaaaabc => aaa

{M,N}匹配M-N次,最大化优先
例如:a{2,5}
aabcd => aa
caaaacd => aaaa
caaaaaaaacd => aaaaa

匹配同类型

\d匹配数字
例如:\d
c123d => 1

\w匹配数字和字母
例如:\w{3}
he666 => he6

\s匹配任何空格字符
例如:a\s{2}a
cccca  accc => a  a

边界匹配

^匹配以**开头
例如:^he.
hello bowyn => hel
shello bowyn => 

用$匹配以**结尾
例如:.yn$
hello bowyn => wyn
hello bowyn! =>

.匹配任意,如何匹配?匹配特殊字符

匹配特殊字符
需要用 “\” 进行转义
例如:\.com
7i5.com => .com
例如:^http:\/\/
http://www.7i5.com  => http://
例如:^\^http:\/\/
^http://www.7i5.com => ^http://

指定匹配的选项

使用[]指定要匹配的集合
例如:[abc]{2} # 表示列表中的abc任意两位组成
abcdef => ab
accdef => ac
aadef => aa
afbfcf =>
例如:[a-zA-Z]{2} # 表示从小写a到z和大写A到Z的字母任意两位组成
AxsfOa => Ax
123Fj => Fj

使用[^]指定不要匹配的内容
例如:[^abc]{2}   # 表示只要不是abc里面的任意一个字符组成的两位
abccds => ds
bbcafg => fg

正则表达式分组

  • 重复一个字符串时
  • 使用()进行分组,使用(?<word>\w+)指定组名
  • 从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推
  • 表达式(A)(B(C))分组情况解析
    • 0 (A)(B(C))
      1 (A)
      2 (B(C))
      3 (C)

使用()对匹配的内容分组
例如:(\d{1,3}\.){3}\d{1,3}

192.168.1.1 => 192.168.1.1

43.116.23.89 => 43.116.23.89

使用\1、\2返向引用

例如:He (l..e)s her \1r.

He loves her lover.
He likes her liker.

=>

He loves her lover.
He likes her liker.

对分组命名反向引用

例如:He (?<name>l..e)s her \k<name>r.

He loves her lover.
He likes her liker.

=>

He loves her lover.
He likes her liker.


贪婪模式VS非贪婪模式

贪婪匹配

  • 在整个表达式匹配成功的前提下,尽可能多的匹配

非贪婪匹配

  • 在整个表达式匹配成功的前提下,以最少的匹配字符

默认是贪婪模式

贪婪模式举例

  • 表达式 ab.+c
    • 测试数据:abacaxcd
    • 匹配结果:abacaxc

非贪婪模式举例

  • 只需在匹配pattern中加上“?
  • 表达式 ab.*?c
    • 测试数据:abacaxcd
    • 匹配结果:abac

 

人已赞赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索