首页 > Note > 正则表达式

正则表达式

2018年2月18日 发表评论 阅读评论

正则表达式为高级的文本模式匹配、抽取、与/或文本形式的的搜索与替换功能提供基础。简单地说,它可以匹配多个字符串。

符号

择一匹配、任意匹配

  • | 择一匹配,表示从多个模式中选择其中一个 ,如 at | home 既可以匹配 at, 也可以匹配 home
  • . 任意匹配,表示匹配除了换行符 \n 以外的任何一个字符

边界匹配

  • ^ $ 用于匹配行的开头和结尾
  • \b 用于匹配字符边界。\B 则与之相反。如 \bthe 匹配任何以 the 起始的单词,\Bthe 匹配任何不以 the 起始的单词

字符集

单一匹配

  • [ ] 匹配某些特定的字符。 如 b[au]t 可以匹配 bat,也可以匹配 but. 它和 b(a|u)t 是等价的。需要注意的是,[ ] 只能匹配单字符。如,想要同时匹配 beat bit,需要使用 b(ea|i)t。该符号还有一些其它用法:

限定范围

  • [ ] 中使用连接字符连接,用于指定一个字符的范围。如 [a-zA-Z] 可以匹配从 a~z,从 A~Z 的任意一个字符。如 z.[0~9] 用于匹配 z 后面跟一个任意字符,再跟一个任意数字。
  • [ ] 中的第一个字符如果是 ^ ,表示不匹配括号中的任意字符。 如 [^0-9abc] 表示不匹配任意数字,也不匹配abc中的任一个字符。

存在与频数

* + ? 三个字符,可以匹配 0 个,1 个或多个字符。

  • * 可以匹配其左边的正由表达式出现 0 次或多次
  • + 可以匹配其左边的表达式 1 次或多次
  • ? 可以匹配其左边的表达式 0 次或 1 次
  • { } 可以控制表达式匹配的频次。如 fo{2}t 可以匹配 foot。若 { } 中使用了 ,{M,N} 表示限定范围为 M~N 次。如 fo{2,3} 可以匹配 foot, 也可以匹配 fooot.

贪婪匹配

? 除了上述匹配 0~1 次的意义 ,存在其他含义:如果其紧跟在任何使用闭合操作符的匹配后面,它将直接要求正则表达式匹配 尽可能少 的次数。当使用了分组操作符时,正则表达式引擎会试图匹配尽可能多的字符。这叫做 贪婪匹配 。问号则要求正则表达式引擎匹配尽可能少的字符,留下尽可能多的字符给后面的模式来匹配。如 </?[^>]+> 可用于匹配任意 html 标签

指定分组

( ) 有两个功能:1.对正则表达式进行分组 2.匹配子组。
有些时候,我们可能对之前成功匹配到的数感兴趣。
(等完善)

扩展表示法 (并非所有的引擎都支持)

(?...) 圆括号内以一个问号开始,它是一种扩展表示法。它通常用于判断之前提供的标识,用于实现一个前视或后视匹配,或者条件检查。

  • (?:\w+\.)* 以句点作结尾。如 google. ,但这些匹配不会保留焉
  • (?#comment) 不做匹配,只做注释
  • (?=.com) 如果一个字符串后面跟着 .com 才做匹配,
  • (?!.net) 如果一个字符串后面跟不是 .net 才做匹配
  • (?<=400-) 如果字符串之前是 400- 开始匹配
  • (?<!192\.168\.) 如果字符串之前不是 192.168. 才开始匹配,用于过滤 C 类 IP
  • (?(a)b|c) 如果匹配组 a 存在,则与 b 匹配,否则与 c 匹配

一些常用的正则表达式

  1. 合法用户名 : 由数字,下划线和26个字母组成的字符串
    ^\\w+$
  2. 密码强度 :包含大小写字母和数字的组合,不能有特殊字符,长度在8~10之间
    ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
  3. 只能是中文
    ^[\\u4e00-\\u9fa5]{0,}$
  4. email
    ^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$
  5. 身份证号码 :15 位或 18 位
    ^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$
    ^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$
  6. 日期 : “yyyy-mm-dd“ 格式的日期校验,已考虑平闰年
    ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
  7. 手机号
    ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.