正则实例

2021-01-12 admin (149) (0) python测试>正则
  

版权申明

1.本站部分文章收集于互联网,不承担任何责任和版权问题。

2.若有侵权内容、不妥之处,请联系我们确认后立即删除。

3.本站文章仅供学习研究用途,请勿用于商业目的。

4.联系邮箱 pysnake@qq.com

详情介绍

0\d{2}-\d{8}|0\d{3}-\d{7}
例子:011-12345678

\(?0\d{2}\)?[- ]?\d{8}|0\d{2}[- ]?\d{8}

(): 0次或1次
0开头+2位数字
[-或者空格]:0次或者1次
| 或
例子:022 或者(022)
           且
      - 或者  空格
    +8位数字

0\d{2}[- ]?\d{8}
例子: 022
        且
      -或者空格
  +8位数字

\d{5}-\d{4}|\d{5}
5位数字-4位数字 或 5位数字

\d{5}|\d{5}-\d{4}
 5位数字或5位数字-4位数字 
(\d{1,3}\.){3}\d{1,3}


(\d).或(\d\d).或(\d\d\d) 重复三次
+
(\d)或(\d\d)或(\d\d\d)


((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
解析:
((2[0-4]\d或25[0-5]或[01]?\d\d?)\.)
重复三次
+  2[0-4]\d|25[0-5]|[01]?\d\d?)
==
(2[0,4]\d). 或(25[0,5]).或([01]\d\d).或([01]\d).或(\d\d).或(\d).
+

2[0-4]\d|25[0-5]|[01]?\d\d?


\d数字
\s空白符
\w字母数字下划线汉字
.除换行符以外
\b开头或结束
^开始
$结束

============================
<a[^>]+>

<a+>

\b(\w+)\b\s+\1\b


\b(?<Word>\w+)\b\s+\k<Word>\b

 X{n}
1或多  0或1
X{n,}? 


 String content="323cds33cds0293";
       Pattern p=Pattern.compile("\\d+");
       Matcher m=p.matcher(content);
       while(m.find()){
              content=content.replace(m.group(),'xxx');
       }

eg:
var reg=new RegExp('\\<(\\w+)\\>','g');
var str="fsd<abc>f<cdd><fods><foire<fdso<forg>";
var match=str.match(reg);

「to(nite|knight|night)」匹配字符串‘hot–tonic– tonight! ’

来看个简单的例子,用「ab?c」匹配abc。「a」匹配之后,匹配的当前状态如下:
‘a?bc’
「a?b?c」
现在轮到「b?」了,正则引擎需要决定:是需要尝试「b」呢,还是跳过?因为?是匹配优先的,它会尝试匹配。但是,为了确保在这个尝试最终失败之后能够恢复,引擎会把:
‘a?bc’
「ab? ?c」

以‘CA–95472–USA’为例。在「.*」成功匹配到字符串的末尾时,星号约束的点号匹配了13
个字符,同时保存了许多备用状态。这些状态表明稍后的匹配开始的位置:在正则表达式中是「^.*? ([0-9][0-9])」,在字符串中则是点号每次匹配时保存的备用状态。
现在我们已经到了字符串的末尾,并把控制权交给第一个「[0-9]」,显然这里的匹配不能成功。没问题,我们可以选择一个保存的状态来进行尝试(实际上保存了许多的状态)。现在回溯开始,把当前状态设置为最近保存的状态,也就是「.*」匹配最后的A之前的状态。忽略(或者,如果你愿意,可以使用“交还”)这个匹配,于是有机会用「[0-9]」匹配这个A,但这同样会失败。

\b(\w+)\b\s+\1\b
==
\b(\w+)\b\s+\b(\w+)\b

\b(?<t>\w+)\b\s+\k<t>\b
==
\b(?<t>\w+)\b\s+\b(?<t>\w+)\b


2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)
==
(?#注释的内容)

\b(?<t>\w+)\b
后向引用
\k<t>
\b(\w+)\b\s+\1\b

\b(\w+)\b\s+\1\b
==
\b(\w+)\b\s+\b(\w+)\b
(exp)
(?<name>exp)
\b\w+(?=ing\b)
零宽度正预测先行断言
匹配img前面的位置

(?<=\bre)\w+\b
零宽度正回顾后发断言
(?<=a)
匹配a后面的位置


\b(?<t>\w+)\b
后向引用\k<t>


I'm singing while you're dancing.时,它会匹配sing和danc。

\b\w+(?=ing\b)

reading a book时,它匹配ading
(?<=\bre)\w+\b

假如你想要给一个很长的数字中每三位间加一个逗号
((?<=\d)\d{3})+\b

2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)


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

(?=a) 匹配a前面的部分
(?<=a) 匹配a后面的部分

\b(\w+)\b\s+\1\b
==
\b(\w+)\b \b(\w+)\b
\b(?<Word>\w+)\b\s+\k<Word>\b
==
(a)匹配a内容
(?<t>b)  \k<t> 匹配b内容
(?:b) 不捕获b内容


(a)
(?:a)
(?<t>a)
(?#注释的内容)
(a)
(?:a)
(?<=a)
(?:a)
(?)

捕获
(a)
(?<t>a)  (?””a)  \k<t>
(?:a)
零点断言
(?=a)零宽度正预测先行断言
(?<=a)零宽度正回顾后发断言

(?<=\s)\d+(?=\s)
I'm singing while you're dancing.时,它会匹配sing和danc。

\b\w+(?=ing\b)
查找reading a book时,它匹配ading。
(?<=\bre)\w+\b

((?<=\d)\d{3})+\b,用它对1234567890进行查找时结果是234567890
((?<=\d)\d{3})+\b
==((?<=\d)\d\d\d)+\b


 \b\w*q[^u]\w*\b匹配包含后面不是字母u的字母q的单词。但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q出现在单词的结尾的话,像Iraq,Benq,这个表达式就会出错。这是因为[^u]总要匹配一个字符,所以如果q是单词的最后一个字符的话,后面的[^u]将会匹配q后面的单词分隔符(可能是空格,或者是句号或其它的什么),后面的\w*\b将会匹配下一个单词,于是\b\w*q[^u]\w*\b就能匹配整个Iraq fighting。负向零宽断言能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。现在,我们可以这样来解决这个问题:\b\w*q(?!u)\w*\b


(?!exp)    匹配后面跟的不是exp的位置

\b\w*q(?!u)\w*\b
\d{3}(?!\d)
==
\d\d\d
\b((?!abc)\w)+\b
==
断言
(?=a)


(?<=a)

(?!a)

零宽度负预测先行断言
(?!a)

(?<!)
零宽度负回顾后发断言
(?<![a-z])\d{7}

请详细分析表达式
(?<=<(\w+)>).*(?=<\/\1>),这个表达式最能表现零宽断言的真正用途

零宽度负预测先行断言
(?!a)
零宽度负回顾后发断言
(?<!a)

"Warning!" + '\u0007' 中的 "\u0007"

[\b]{3,}

"Name\t Addr\t" 中的 "Name\t" 和 "Addr\t"

查找I'm singing while you're dancing.时,它会匹配sing和danc。

\b\w+(?=ing\b)

(?<=\bsing)\w+\b

(?<=\s)\d+(?=\s)

\b\w*q[^u]\w*\b

例如在查找reading a book时,它匹配ading。

(?<=\bre)\w+\b
零宽度正回顾后发端阳
零宽度正预测先行断言

\b\w+(?=ing\b)
\b\w*q(?!u)\w*\b 
零宽度负预测先行断言
零宽度负回顾后发断言
比如匹配一个单词的前两个字母不包括aeiou
\b(?<![aeiou])\w+\b
比如匹配一个单词的含q且后面不匹配aeiou
\b\w*q(?![aeiou])\w*\b
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:

例:一个字符串“abcdakdjd”
regex="a.*?d";    懒惰匹配
abcd
regex2="a.*d";   贪婪匹配
abcdakdjd

零宽度正预测先行断言
(?=a)
例子: welcome to china!
匹配wel
\b\w+(?=come\b)

零宽度正回顾后发断言
(?<=a)
匹配come
(?<=\bwel)\w+\b

零宽度负预测先行断言
(?!a)
匹配单词含l后面跟的不是c的单词
\b\w*l(?!c)\w*\b

领宽度负回顾后发断言
(?<!a)
匹配单词含l前面不是c的单词
\b\w*(?<!c)l\w*\b

a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)
代码/语法    说明
*?    重复任意次,但尽可能少重复
+?    重复1次或更多次,但尽可能少重复
??    重复0次或1次,但尽可能少重复
{n,m}?    重复n到m次,但尽可能少重复
{n,}?    重复n次以上,但尽可能少重复


表6.常用的处理选项
名称    说明
IgnoreCase(忽略大小写)    匹配时不区分大小写。
Multiline(多行模式)    更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)
Singleline(单行模式)    更改.的含义,使它与每一个字符匹配(包括换行符\n)。
IgnorePatternWhitespace(忽略空白)    忽略表达式中的非转义空白并启用由#标记的注释。
ExplicitCapture(显式捕获)    仅捕获已被显式命名的组。

有时我们需要匹配像( 100 * ( 50 + 15 ) )这样的可嵌套的层次性结构,这时简单地使用\(.+\)则只会匹配到最左边的左括号和最右边的右括号之间的内容(这里我们讨论的是贪婪模式,懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次数不相等,比如( 5 / ( 3 + 2 ) ) ),那我们的匹配结果里两者的个数也不会相等。有没有办法在这样的字符串里匹配到最长的,配对的括号之间的内容呢?
为了避免(和\(把你的大脑彻底搞糊涂,我们还是用尖括号代替圆括号吧。现在我们的问题变成了如何把xx <aa <bbb> <bbb> aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来?
这里需要用到以下的语法构造:
(?'group') 把捕获的内容命名为group,并压入堆栈(Stack)
(?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
(?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
(?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
代码/语法    说明
\a    报警字符(打印它的效果是电脑嘀一声)
\b    通常是单词分界位置,但如果在字符类里使用代表退格
\t    制表符,Tab
\r    回车
\v    竖向制表符
\f    换页符
\n    换行符
\e    Escape
\0nn    ASCII代码中八进制代码为nn的字符
\xnn    ASCII代码中十六进制代码为nn的字符
\unnnn    Unicode代码中十六进制代码为nnnn的字符
\cN    ASCII控制字符。比如\cC代表Ctrl+C
\A    字符串开头(类似^,但不受处理多行选项的影响)
\Z    字符串结尾或行尾(不受处理多行选项的影响)
\z    字符串结尾(类似$,但不受处理多行选项的影响)
\G    当前搜索的开头
\p{name}    Unicode中命名为name的字符类,例如\p{IsGreek}
(?>exp)    贪婪子表达式
(?<x>-<y>exp)    平衡组
(?im-nsx:exp)    在子表达式exp中改变处理选项
(?im-nsx)    为表达式后面的部分改变处理选项
(?(exp)yes|no)    把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no
(?(exp)yes)    同上,只是使用空表达式作为no
(?(name)yes|no)    如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no
(?(name)yes)    同上,只是使用空表达式作为no


\b 单词的开头或结束
\d 数字
\w 字母数字下划线汉字
\s 空白符
.除换行符以外
^开始
$结束


 


需要登录后才可回复

共有0条留言