正则表达式小记

先来看下面一个例子,解析如下IP:

192.160.1.234[port=8080,type=ftp]

将上述表达式中的IP地址,端口号和端口类型提取出来。

没有正则表达式之前,大家猛的一看,估计崩溃了。没办法,用string类的方法截取呗。于是,我们写下了如下代码:

string str = "192.160.1.234[port=8080,type=ftp]";

int indexIP = str.IndexOf("[");

string ip = str.Substring(0, indexIP);

//获取端口号

int serverestart = str.IndexOf("=");

int serverend=str.IndexOf(",");

string server = str.Substring(serverestart+1,serverend-serverestart-1);

//提取协议类型

int typestart = str.LastIndexOf("=");

int typeend = str.LastIndexOf("]");

string type = str.Substring(typestart+1,typeend-typestart-1);

string result = string.Format("IP是:{0},端口号是:{1},协议类型是:{2}",ip,server,type);

MessageBox.Show(result);

接下来,咱们来看下正则表达式能够做什么

正则表达式能够做什么?

正则表达式的用途十分广泛,使用正则表达可以验证用户输入的邮箱格式是否合法,可以获取网页上的邮箱,获取网页上的美图,网站上的职位信息等。

什么是正则表达式?

正则表达式就是一个字符串,正则表达式是用来匹配数据的,和语言无关,在js中也要用到。正则表达式类似于通配符,但又不仅仅是通配符。

注意:不要想着一次性写出通用的正则表达式,够用就行,不行再改。

下面,我们开始进入正题,来看下正则表达式中用于匹配的元字符

元字符(匹配)

01,      通用字符:点

含义:除了换行之外的所有字符

02,      选择字符:[]

含义:一对中括号匹配一个字符

03,      逻辑或:|

含义:和C#中|含义一样

04,      优先级与分组:()

紧接着,我们来介绍下用于限定的元字符

元字符(限定符):

01,      任意个字符(包含0个):*

02,      任意个字符(不含0个):+

03,      是否有:?

04,      N次重复:{n}

05,      至少n次{n,}

06,      N到m次{n,m}

注意:限定符是仅限当前字符(就是前面一个)

元字符(开始与结束):

01,      开头与否定:^

限定必须开头匹配

在[]中使用表示不出现里面的字符

02,      结束与编组:$

限定必须结束匹配

在分组后引用数据

常用的元字符

01,      数字与非数字

数字:\d

非数字:\D

02,空字符与非空字符

空字符:\s

非空字符;\S

可以匹配空格和换行

03,文字与非文字

文字(数字,字母和汉字,不包含标点符号):

文字:\w

非文字:\W

注意点:

字符串转义与c#转义相同

d:digital

s:space

w:word

哎!说了这么多,下面咱们通过一个例子来看下在.Net中如何使用正则表达式

.Net中的正则表达式

在.Net中我们使用Regex类来书写正则表达式

Regex的常用方法:

IsMatch():判断是否匹配

Match():字符串提取

Matches():循环提取

Replace():Replace()

下面来看一个字符串匹配的案例:

案例:匹配正确的身份证号码(15或18位数字,18位数字后可能有X)

分析:这里我们可以使用Regex的静态方法IsMatch来判断是否匹配,其中第一个参数为字符串,第二个参数为正则表达式

bool flag=  Regex.IsMatch(txtphone.Text, @"^(\d{3,4}-?\d{7,8}|\d{11}|\d{5})$");

接下来,咱们来看一个字符串提取的案例:

案例:抓取某网站的所有邮箱。注意:这里是字符串提取,而不是匹配,所以^和$没有必要书写。

分析:在解决这个问题之前,先给大家介绍一个类WebClient。该类的DownLoadString()方法能获取到指定网址的html代码

。下面是实现代码:

WebClient wc = new WebClient();

wc.Encoding = Encoding.Default;

string str = wc.DownloadString("http://www.douban.com/group/topic/9493130/?start=100");

MatchCollection ms= Regex.Matches(str, @"\[email protected](\w+\.)+\w+");

StringBuilder sb = new StringBuilder();

foreach (Match item in ms)

{

sb.AppendLine(item.Value);

}

txtResult.Text = sb.ToString();

输出结果为:

字符串提取组

01,用元括号分组

02,使用Groups获得组集合

首先正则表达式进行匹配提取的时候,按照所提供的“正则表达式”匹配到多个Match,同时Match包含了一个叫做组的概念。组针对一个匹配字符串而言,表示圆括号中的内容。组从左往右开始数,一次编号为1,2,3,使用时只用在groups中使用索引即可。

现在回到刚开始的问题:

192.168.1.100[port=8080,type=ftp]

解析为:IP地址是...的服务器的...端口是打开的,提供的服务是...

学过正则之后,再来看这个问题,就变得异常简单了。

正则解决方案:

string str = "192.168.1.100[port=8080,type=ftp]";

Match match=Regex.Match(str,@"^(\d{3}(\.\d{1,3}){3})\[port=(\d+),type=(\w+)\]$");

if (match.Success)

{

string result = string.Format("IP是{0},端口是{1},类型是{2}", match.Groups[1].Value, match.Groups[3].Value, match.Groups[4].Value);

MessageBox.Show(result);

}

怎么样,比之前的代码简单多了吧!这就是正则表达式的魅力所在。

贪婪模式与非贪婪模式

贪婪模式:从左到右尽可能多的匹配。

C#中默认使用贪婪模式,取消贪婪模式使用?

经验:一般开发的时候不用刻意去修饰为非贪婪模式,只有遇到bug的时候发现是贪婪模式的问题再去解决。如果匹配的结果比自己预想的要多,那么一般都是贪婪模式的原因。

接下用一个案例简单看下贪婪模式

string str = "123agb23424aa123agb23424aa";

Match match = Regex.Match(str, @"((\d+[a-z]+)+)?((\d+[a-z]+)+)");

MessageBox.Show(match.Groups[2].Value);

如果不加?输出结果为123agb23424aa123agb

加上?取消贪婪模式后输出结果为:123agb

时间: 2024-10-27 07:13:16

正则表达式小记的相关文章

C regex 正则表达式小记

如果用户熟悉Linux下的sed.awk.grep或vi,那么对正则表达式这一概念肯定不会陌生.由于它可以极大地简化处理字符串时的复杂度,因此现在已经在许多Linux实用工具中得到了应用.千万不要以为正则表达式只是Perl.Python.Bash等脚本语言的专利,作为C语言程序员,用户同样可以在自己的程序中运用正则表达式.     标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Re

正则表达式小记--匹配但不获取

(?!=XXX[:|:|\s]?)\d{16}(?!=XXX)表示查找XXX内容,但最终结果不包括它(?=XXX)表示查找XXX内容,最终结果包括它[:|:|\s]? 表示 全角冒号,半角冒号,空格 或没有字符 (pattern) 匹配pattern 并获取这一匹配.所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中则使用 $0…$9 属性.要匹配圆括号字符,请使用 '\(

正则表达式分组小记

说是小记,主要是怕忘记了. 一个正则语法-命名分组 正则分组依赖圆括号,每个括号内的表达式是一个分组,为了避免,在一个完整的表达式中出现多个分组,依靠组序号获取组匹配项时的混乱,使用命名分组是很好地方法. 在.Net中语法为  (?<name>pattern)  其中尖括号(<>)可以使用单引号('')替换. 在Python中语法基本一致,只是在组名称前多了一个大写字母P  (?P<name>pattern)   不可以使用单引号替换尖括号. 以Python为例,如图

小记linux正则表达式

正则表达式  grep cut sort uniq 正则表达式是一种表示方式, 让你可以查找匹配特定准则的文本. .    匹配任何单个的字符,但是null除外 *   匹配在它之前的任何数目的单个字符 .*   代表 匹配任一字符的任一长度 ^    匹配前面的正则表达式 ,在字符串或者行的起始处 $   匹配前面的正则表达式,在字符串或行的结束处 []    匹配方括号内的任一字符 ^符号置于方括号里第一个字符则有相反含义:指的是匹配不在列表内的任一字符 \{n,m\}      区间表达式

linux学习小记 (一 )

shell 学习小记: 注意:多看系统脚本  多模仿    su切换用户时需要输入目标用户密码,root(superuser)切换到任何用户都不需要输入密码,- 参数必须要是最后一个(su huhu -) sudo需要输入当前用户密码,拥有sudo特权的用户可以执行 "sudo su -"命令,使用自己的密码切换到root用户 , 所以应该在/etc/sudoers 文件中禁止 sudo 执行su命令 linux文件与颜色: /etc/DIR_COLORS   (命令dircolors

pandas小记:pandas数据结构及基本功能

http://blog.csdn.net/pipisorry/article/details/18010307 pandas的数据 结构:Series.DataFrame.索引对象pandas基本功能:重新索引,丢弃指定轴上的项,索引.选取和过滤,算术运算和数据对齐,函数应用和映射,排序和排名,带有重复值的轴索引 Pandas介绍 pandas含有使数据分析工作变得更快更简单的高级数据结构和操作工具.它是基于NumPy构建的,让以NumPy为中心的应用变得更加简单. 通常建议你先学习NumPy,

Sublime text 神器小记

以前一直使用的都是Editplus,一直感觉都是很不错的. 但是最近接触到sublime text,我就fall in love with it. Sublime 的意思是"顶峰,高尚,非凡的"意思.多么霸气的名字啊..好吧,不瞎扯了. 其实我觉的不需要到网上乱找一通,什么中文破解版的,乱七八糟的.就直接到官方网网站进行下载. 虽然是没有注册的,偶尔会弹出一个让你去获取License的 框框外,没有其他任何影响. 下砸网址:http://www.sublimetext.com/ 不过我

js 小记

1.操作符的优先级 function(){}()报语法错误的原因: 一元操作符是右序优先结合的.所以你的表达式相当于:function()({}())//实践得出报错都是一样的:所以应该:(function(){})(); 但为什么(function(){}())不报错而且能执行呢? 分组操作符: 主要用途: 1.结合逗号操作符用于赋值.例如:var num = (5,1,4,8,0);这里num最后的值为0. 2.转换为表达式.比如eval('('+jsStr+')');又比如:functio

shell scripts小记

1 开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序.当编写脚本完成时,如果要执行该脚本,还必须使其可执行.要使编写脚本可执行:编译 chmod +x filename 这样才能用./filename 来运行 2 注释在进行shell编程时,以#开头的句子表示注释,直到这一行的结束. 3 变量在shell编程中,所有的变量都由字符串组成,并且不需要对变量进行声明.要赋值给一个