正则表达式的使用简介

时间:2022-03-27 19:45:01

正则表达式常用元字符
  .  匹配除换行符以外的任意字符
  \b  匹配英文单词的开始和结束,只是匹配一个位置
  \d  匹配一个阿拉伯数字,多个数字可以这样 \d{3} 3个连续的数字
  \w  匹配字母或数字或下划线或汉字
  \s  匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。
  *  表示前边的内容可以连续重复使用任意次以使整个表达式得到匹配
  +  匹配重复1次或更多次
  ^  匹配你要用来查找的字符串的开头,
  $  匹配字符串的结尾,例如:QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$
  ?  重复零或一次
  {n}  重复n次
  {n,}  重复n次或更多
  {n,m}  重复n至m次

分枝条件符号 | :
  \d{5}-\d{4}|\d{5}这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字

分组符号 () :
  \d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。可能出现 999.999.999.999

  更好的描述
  ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

反义:
  \W匹配任意不是字母,数字,下划线,汉字的字符
  \S匹配任意不是空白符的字符
  \D匹配任意非数字的字符
  \B匹配不是单词开头或结束的位置
  [^x]匹配除了x以外的任意字符
  [^aeiou]匹配除了aeiou这几个字母以外的任意字符

后向引用:

  用于重复搜索前面某个分组匹配的文本,\1代表分组1匹配的文本
  \b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty
  自己指定子表达式的组名:
  (?<Word>\w+)(或者把尖括号换成'也行:(?'Word'\w+)),这样就把\w+的组名指定为Word了
  上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b


  捕获(exp)匹配exp,并捕获文本到自动命名的组里
  (?<name>exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
  (?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号
  零宽断言

  (?=exp)匹配exp前面的位置
  (?<=exp)匹配exp后面的位置
  (?!exp)匹配后面跟的不是exp的位置
  (?<!exp)匹配前面不是exp的位置
  注释(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

  (?=exp) 也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp
  \b\w+(?=ing\b) 查找I'm singing while you're dancing.时,它会匹配sing和danc。
  (?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp
  (?<=\bre)\w+\b 查找reading a book时,它匹配ading
  (?!exp) 零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp。只匹配一个位置,并不消费任何字符
  区别[^x]
  \b((?!abc)\w)+\b匹配不包含连续字符串abc的单词

  一个更复杂的例子 (?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内里的内容
  如:<b>和</b>

注释:
  (?<=       # 断言要匹配的文本的前缀
     <(\w+)>    # 查找尖括号括起来的字母或数字(即HTML/XML标签)
  )         # 前缀结束
  .*        # 匹配任意文本
  (?=       # 断言要匹配的文本的后缀
    <\/\1>    # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
  )        # 后缀结束

贪婪与懒惰
  当正则表达式中包含能接受重复的限定符时,
  通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符
  a.*b 来搜索aabab的话,它会匹配整个字符串aabab

  懒惰匹配,也就是匹配尽可能少的字符
  *?重复任意次,但尽可能少重复
  +?重复1次或更多次,但尽可能少重复
  ??重复0次或1次,但尽可能少重复
  {n,m}?重复n到m次,但尽可能少重复
  {n,}?重复n次以上,但尽可能少重复
  a.*?b匹配aabab 找到aab(第一到第三个字符)和ab(第四到第五个字符)
平衡组/递归匹配
  (?'group') 把捕获的内容命名为group,并压入堆栈(Stack)
  (?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
  (?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
  (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败

  < #最外层的左括号
  [^<>]* #最外层的左括号后面的不是括号的内容
  (
  (
  (?'Open'<) #碰到了左括号,在黑板上写一个"Open"
  [^<>]* #匹配左括号后面的不是括号的内容
  )+
  (
  (?'-Open'>) #碰到了右括号,擦掉一个"Open"
  [^<>]* #匹配右括号后面不是括号的内容
  )+
  )*
  (?(Open)(?!)) #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还有,则匹配失败

  > #最外层的右括号

网上的资源及本文参考文献



  参考:http://deerchao.net/tutorials/regex/regex.htm#resources