Ch3nyang's blog collections_bookmark

post

person

about

category

category

local_offer

tag

rss_feed

rss

正则表达式学习

calendar_month 2021-10
archive 杂项
tag regex

本文介绍了正则表达式的基础知识及常用表达式

直接匹配

也就是和正常搜索一样,直接输入一个字符串。正则表达式会对我们输入的字符串进行全文匹配。例如:

  • aeiou

    aeiou

    ✔ fskaeiouvd

    ❌ aeiuo

    ❌ eiou

    ❌ aetiou

范围匹配

我们使用方括号 [] 进行范围匹配,正则表达式会匹配到方括号中的任一一个字符。例如:

  • [aeiou]

    e

    ✔ tia

    ❌ s

    ❌ sdfg

多个方括号并排则依次匹配。例如

  • [aeiou][aeiou]

    uu

    ea

    ✔ tia

    ❌ e

    ❌ as

  • [aeiou][sdfg]

    us

    ✔ sus

    ❌ su

  • a[aeiou]

    as

    ✔ sas

    ❌ su

    ❌ ea

如果前面加上^,也可以匹配除了方括号内所有字符以外的字符。例如:

  • [^aeiou]

    t

    ✔ as

    ❌ a

    ❌ aei

可以用小短横表示范围,常用在数字、大小写字母上。例如:

  • [2-7]

    3

    ✔ s5t

    ❌ s

    ❌ 8

  • [a-z]

    b

    ✔ 3cs

    ❌ B

  • [a-zA-Z]

    b

    B

    ❌ 2

限定匹配

当我们需要重复前面的内容 n 次时,使用大括号 {n}。例如:

  • [2-7]{5}

    34736

    ✔ s34736t34736

    ❌ 347s36

    ❌ 347

    ❌ 347367

  • a[2-7]{5}

    a34736

    ✔ sa34736t

    ❌ as34736

当我们需要重复前面的内容至少 n 次时,使用大括号 {n,}。例如:

  • [2-7]{3,}

    347

    34736

    ❌ 34

当我们需要重复前面的内容至少 n 次至多 m 次时,使用大括号 {n,m}。例如:

  • [2-7]{3,5}

    347

    3473

    ❌ 34

    ❌ 347367

我们使用星号 * 表示 {0,} 的相同意思。例如:

  • [2-7]*

    347

    **

    ❌ a

我们使用加号 + 表示 {1,} 的相同意思。例如:

  • [2-7]+

    347

    3

我们使用问号 ? 表示 {0,1} 的相同意思。例如:

  • [2-7]?

    3

    **

    34

特殊匹配

我们使用竖线 | 表示或。例如:

  • [2-7]|[a-z]

    2

    a

    ❌ 8

加了小括号的表达式可以视作子表达式。例如:

  • ([2-7]|[a-z])*

    222asf4

    afgr33f

一些特殊字符可以用斜杠 / 表示。例如:

  • \n 换行
  • \r 回车
  • \f 换页
  • \t 制表符
  • \v 垂直制表符
  • \s 相当于 [\n\r\f\t\v]
  • \S 相当于 [^\n\r\f\t\v]
  • \w 相当于 [A_Za_z0-9_]
  • \d 相当于 [0-9]

还有一些特殊的匹配符。例如:

  • . 相当于 [^\n\r]

一些符号用于定位。例如:

  • $ 匹配字符串结束位置
  • ^ 如果不在中括号 [] 中,则匹配字符串开始位置
  • \b 匹配单词边界
  • \B 匹配非单词边界

对于上面提到的符号,如果要匹配它们本身,需要在前面加上斜杠 \。例如:

  • \?
  • \[
  • \$

断言

使用 exp1(?=exp2) 查找 exp2 前面的 exp1。例如:

  • a(?=[\d+])

    ✔ 123a123aba

同理,

使用 (?<=exp2)exp1 查找 exp2 后面的 exp1。

使用 exp1(?!exp2) 查找后面不是 exp2 的 exp1。

使用 (?<!exp2)exp1 查找前面不是 exp2 的 exp1。

一些常用例子

  • 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
  • 禁止输入含有~的字符:[^~\x22]+
  • Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  • InternetURL:[a-zA-z]+://[^\s]*^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
  • 手机号码:^(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])\d{8}$
  • 国内固定电话号码:\d{3}-\d{8}|\d{4}-\d{7}
  • 18位身份证号码:^((\d{18})|([0-9x]{18})|([0-9X]{18}))$
  • 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
  • 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-14之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,14}$
  • 日期格式:^\d{4}-\d{1,2}-\d{1,2}
  • 一年的12个月:^(0?[1-9]|1[0-2])$
  • 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
  • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
  • 中文字符:[\u4e00-\u9fa5]
  • 双字节字符:[^\x00-\xff]
  • 空白行:\n\s*\r
  • HTML标记:<(\S*?)[^>]*>.*?</\1>|<.*? />
  • 首尾空白字符:^\s*|\s*$或(^\s*)|(\s*$)
  • 腾讯QQ号:[1-9][0-9]{4,}
  • 中国邮政编码:[1-9]\d{5}(?!\d)
  • IP地址:\d+\.\d+\.\d+\.\d+
  • IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

Comments

Share This Post