Regex(正则表达式)学习

本文导读

很早就开始接触正则表达式,到现在才比较深入了解它,原因有两个:

大部分的资料都是抛砖引玉,讲得比较浅显。二、对于复杂的正则表达式看着头疼,不明白其含义,甚至里面的一些正则形式以前从未没见过。但是越想远离它,它却离你越近,从以前的网页抓取工具,到现在的接口实现,都是需要正则的,所以要系统的学习一下Regex,以后再遇到关于匹配的问题就可以简单的解决了,它给我们带来的诸多好处,只有我们想不到,没有它做不到。下面就介绍一下像我这样菜鸟看不懂的确是必备正则知识,如果掌握了,那么以后在应用正则的时候显得比较得心应手。

(注:本文适合认识Regex表达式符号的人学习,如果不了解正则符号的可先学习一下正则符号的含义在看此文)。

基础之环视

零宽断言:只和位置有关,不匹配字符。

占有字符:配置的是字符,如字符串“abc”,正则表达式“a”,匹配结果”a”,其匹配内容保存到了匹配结果中,称为占有字符。

环视(零宽断言)只和位置有关,环视匹配的内容不保存到匹配结果中,只是作为一种修饰相当于副词。环视的正则符号表示如下:

表达式

说明

(?<=Expression)

逆序肯定环视,表示所在位置左侧能够匹配Expression

(?

逆序否定环视,表示所在位置左侧不能匹配Expression

(?=Expression)

顺序肯定环视,表示所在位置右侧能够匹配Expression

(?!Expression)

顺序否定环视,表示所在位置右侧不能匹配Expression

举例:

1 字符串:“bbbaaaabbbccc”

需求:要得到”aaaa”与“ccc”之间的”bbb”,如何用环视实现?

分析:1.需求中需要匹配的“bbb”的左边是”aaaa”

      2.需求中需要匹配的“bbb”的右边是”ccc”

      3.需要匹配的字符串为”bbb”

实现:1.(?<=a{4})

      2.(?=c{3})

      3.b{3}

结果:(?<=a{4})b{3}(?=c{3})

2 字符串

aaa

aaa

msdn

需求:得到除

之外的标签。

分析:1.得到标签

      2.标签不能是

或者

,读作:’<’位置的右边不能出现p>或者/p>

实现:1.<[^>]*>

      2.(?!/?p>)

结果:(?!/?p>)<[^>]*>

基础之捕获组

捕获组的作用是将正则表达式匹配的内容放到内存中的一个组去,在需要的时候通过组号或者命名的名称将其从内存中取出来。捕获组分为三种:普通捕获组、命名捕获组、非捕获组。其形式如下:

表达式

说明

(Expression)

普通捕获组,将子表达式Expression匹配的内容保存到以数字编号的组里

(? Expression)

命名捕获组,将子表达式Expression匹配的内容保存到以name命名的组里

(?:Expression)

进行子表达式Expression的匹配,并将匹配内容保存到最终的整个表达式的区配结果中,但Expression匹配的内容不单独保存到一个组内

举例:

1

需求:提取字符串中的标题和简介,并在程序中应用。

分析:1.title=“…”为标题。

      2.标签之间的为简介。

实现:1..*?)\”>

      2.(?.*?)

结果:.*?)\”>(?.*?)<\/a>

应用:

String test=上面的原字符串;

Regex reg = new Regex(@".*?)”>(?.*?));

MatchCollection mc = reg.Matches(test);

foreach(Match m in mc)

{

     richTextBox2.Text += m.Groups["title"].Value + "\n";//标题

     richTextBox2.Text += m.Groups["content"].Value + "\n";     //简介

}

输出结果:

jBPM4工作流开发实战 之 第三部分 jBPM4开发

jBPM4工作流开发实战 之 第三部分 ..

Android学习笔记——异步图片加载

Android学习笔记——异步图片加载

基础之贪婪模式和非贪婪模式

贪婪模式就是如果正则表达式匹配内容成功了,但是字符串后面还有符合正则的匹配内容,那么该内容也会保存到结果中,通俗的话来讲就是字符串中有多少内容符合该正则表达式,那么就匹配多少。

非贪婪模式与贪婪模式相反,如果匹配成功,那么匹配就结束。字符串中若还有满足条件的内容,该内容不会被匹配,成为非贪婪模式,用‘量词+?’来表示非贪婪模式。量词,如: * {m,n} +等等。

举例:

1 字符串:

aaaa
bbb

Regex表达式:

.*

匹配内容:

aaaa
bbb

       上述匹配为贪婪模式。

2

aaaa
bbb

Regex表达式:

.*?

匹配内容:

aaaa

       上述匹配为贪婪模式。

升华之匹配模式

匹配模式也是我们在写正则表达式时经常用到的,这样讲或许不熟悉,在正则匹配时我们经常用到IgnoreCase,这可能不陌生,没错它就是匹配模式中的一种,匹配模式分为外联和内联,外联和内联一一对应,实现的功能是一样的,比如IgnoreCase(外联)对应的内联为(?i)表示忽略大小写。

常用外联:IgnoreCase、Multiline、Singleline、

常用内联:i,m,s

内联形式:(?[ims])ExPression

其中Multiline和m功能一样,改变’^’和’$’的意义,以’\n’换行符作为临界点表示字符串的开头和结尾。

Singleline和s功能一致,改变‘.’的范围,’.’不包含’\n’换行符,使用该模式’.’就包含‘\n’

举例:

1字符串 aaa

         bbb

         ccc

需求:在该字符串的每一行结尾加一个123

实现: String result=Regex.Replace(yourStr,@"^.*$","$0123", RegexOptions.Multiline);

结果:

aaa123

bbb123

ccc123

2需求:匹配所有字符

 实现:(?s).*

描述:因为.不包含’\n’,所以这里使用内联匹配s模式。

总结:

正则匹配到此告一段落,本文主要提供了我们常用的字符串匹配的解决方法,到目前为止这是我认为本文涵盖了我遇到的关于正则匹配的所有解决办法,正则中还有反向引用以及NFA的匹配原理,本文没有进行讲解,如有兴趣可以查一下msdn关于正则表达式的描述。或许上面的例子还不足以让我们明白其原理和用法,不明白的地方可以根据本文描述的内容在网上去查找学习,如有错误的地方还请大家指正。

你可能感兴趣的:(Regex(正则表达式)学习)