[原创]正则表达式在c#中的学习和应用

DEELX 正则表达式.chm [点击下载]
通过学习正则表达式可以让我们从大量的信息中筛选出有用的部分。
通过正则表达式的学习我们可以简化很多以前看起来无法实现的工作。
以下为我学习正则表达式的心得

学习篇
一。学习的首要条件是搭建好一个良好的学习环境,好的学习环境让人学习事半功倍,在这里我把我个人学习时搭建的环境提供出来。

后台cs文件的代码:

Default.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;


public partial class Default: System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
     
    }
    /// <summary>
    /// 正则表达式的调试环境
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btn_run_Click(object sender, EventArgs e)
    {
        string str_source = txt_content.Text;                               // 需要筛选的内容
        string str_reg = txt_reg.Text;                                          // 要匹配的正则表达式字符串
        Regex reg = new Regex(str_reg);                        
        MatchCollection matchs = reg.Matches(str_source);            // 获取符合匹配条件的集合
        // 将集合输出显示出来
        if (matchs.Count > 0)
        {
            for (int i = 0; i < matchs.Count; i++)
            {
                txt_output.Text += i + ":" + matchs[i].Value + "\r\n";
                GroupCollection groups = matchs[i].Groups;
                if (groups != null && groups.Count > 0)
                {
                    foreach (Group group in groups)
                    {
                        txt_output.Text += "\t@@ " + group.Value + "\r\n";
                    }
                }
            }
        }
        txt_msg.Text = matchs.Count + "";
    }

}

前台的aspx文件的代码:
Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" ValidateRequest="false" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        原始字符串内容:<asp:TextBox runat="server" ID="txt_content" Rows="5" Columns="100" TextMode="MultiLine" Wrap="true"></asp:TextBox>
        <br />
        正则表达式:<asp:TextBox runat="server" ID="txt_reg" Rows="5" Columns="100" TextMode="MultiLine" Wrap="true"></asp:TextBox>
        <br />
        <asp:Button runat="server" ID="btn_run" Text="测试正则表达式" OnClick="btn_run_Click" />
        匹配到:<asp:TextBox runat="server" ID="txt_msg" Width="40"></asp:TextBox>个
        <br />
        <asp:TextBox runat="server" ID="txt_output" Rows="20" Columns="100" TextMode="MultiLine" Wrap="true"></asp:TextBox>
    </div>
    </form>
</body>
</html>



显示效果:
原始字符串内容:
正则表达式:
匹配到:
如此一来我们就配置好了学习正则表达式的学习环境
如果对于c#配置环境不了解可以到以下地址测试:
http://www.regexlab.com/zh/workshop.asp?pat=&rto=&txt=&dlt=
二 了解正则表达式的基础知识。

个人是从这个地址获取的基本信息来进行学习的
http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm

但是由于里面写的太全所以不知道那些是重点那些不是(其实都是重点只不过有些我们用不到而已)

这里我就把我认为比较重要也比较基础实用的一些基本用法列举出来

一开始只要了解一下这些就基本够用了

表1.常用的元字符
代码 说明
. 小数点可以匹配除了换行符(\n)以外的任意一个字符 注意:回车是(\r)和换行还是有点区别 可以被匹配
\w 任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个
\W \w的补集
\s 匹配任意的空白符 空格、制表符\t、回车换行符\n
\S \s的补集
\d 任意一个数字,0~9 中的任意一个
\D \d的补集
^ 匹配字符串的开始
$ 匹配字符串的结束


首先让我们先练习下表一的内容吧
调试格式以我配置的环境页面为准
原始字符串内容 正则表达式 匹配后的结果

1a(

. 0:1
 @@ 1
1:a
 @@ a
2:(
 @@ (

1a(

\w 0:1
 @@ 1
1:a
 @@ a

1a(

\s (什么都没匹配到)

1a(

\d 0:1
 @@ 1

注:
冒号前面的数字为匹配的索引
@@表示匹配的组 后面的内容为组的内容

那下面这个例子来说明

1a(

. 0:1
 @@ 1
1:a
 @@ a
2:(
 @@ (
内容               1a(
用正则表达式    .
匹配后的结果为
索引为0的匹配字符是1 有1个组 组的内容为1(组的概念以后再解释)

通过以上例子基本能够了解常用原字符的范围以及用处

但是仅仅拥有常用的原字符还不够,常用原字符只能匹配单个字符
如果遇到要匹配多个同类字符就必须用到常用限定符
表2.常用的限定符
代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

接下来练习下来了解各个符号的用法以及意义
原始字符串内容 正则表达式 匹配后的结果

123abcd

.*等同于.{0,} 0:123abcd
 @@ 123abcd
1:
 @@

123abcd

.+等同于.{1,} 0:123abcd
 @@ 123abcd

123abcd

.?等同于.{0,1} 0:1
 @@ 1
1:2
 @@ 2
2:3
 @@ 3
3:a
 @@ a
4:b
 @@ b
5:c
 @@ c
6:d
 @@ d
7:
 @@

123abcd

.{3} 0:123
 @@ 123
1:abc
 @@ abc

123abcd

.{3,} 0:123abcd
 @@ 123abcd

123abcd

.{3,4} 0:123a
 @@ 123a
1:bcd
 @@ bcd

通过上面的说明及举例我想对基本的正则应该有点了解
那么下面我就讲解比较实用点例子

如何从一串被打乱的字符要从中选取符合自己要求的字符
例如下面一段是混乱的字符(假设这段字符很长我们无法用眼睛去筛选):
2l2j42h32http://www.cnblogs.com/clhed/admin/EditArticles.aspx?postid=1208049ijio23hh3g56hj7pi498fs0
ps:这里的字符是我乱打的,其中混上了我的blog链接
匹配的要求 正则表达式 匹配后的结果

获取字符串中所有的数字项

[\d]+ 1:2
 @@ 2
2:42
 @@ 42
3:32
 @@ 32
4:1208049
 @@ 1208049
5:23
 @@ 23
6:3
 @@ 3
7:56
 @@ 56
8:7
 @@ 7
9:498
 @@ 498
10:0
 @@ 0

获取字符串中所有的英文字母项

[a-z,A-Z]+ 0:l
 @@ l
1:j
 @@ j
2:h
 @@ h
3:http
 @@ http
4:www
 @@ www
5:cnblogs
 @@ cnblogs
6:com
 @@ com
7:clhed
 @@ clhed
8:admin
 @@ admin
9:EditArticles
 @@ EditArticles
10:aspx
 @@ aspx
11:postid
 @@ postid
12:ijio
 @@ ijio
13:hh
 @@ hh
14:g
 @@ g
15:hj
 @@ hj
16:pi
 @@ pi
17:fs
 @@ fs

获取符合一下格式的链接http://www.cnblogs.com/clhed/admin/EditArticles.aspx?postid=1208049

http://www.cnblogs.com/[\w]+/admin/EditArticles.aspx\?postid=[\d]+ 0:http://www.cnblogs.com/clhed/admin/EditArticles.aspx?postid=1208049
 @@ http://www.cnblogs.com/clhed/admin/EditArticles.aspx?postid=1208049

匹配所有的字母和匹配所有的数字就不用讲了这2个比较简单
至于匹配固定格式的链接(这算一种应用级别的需求了)
http://www.cnblogs.com/clhed/admin/EditArticles.aspx?postid=1208049
在写正则前必须先对格式进行分析
我对上面的链接的分析师吧这个链接分为了会变化的部分和不会变化的部分
http://www.cnblogs.com/
/admin/EditArticles.aspx?postid=
很明显以上两段为不可变化的部分
可变化的部分为
clhed          这个是用户名
1208049     这个是用户id
这2个都会根据人的不同变化成不同的链接
这里我是把用户名当成只能是字符进行匹配所以我用了[\w]而不知道他的位数所以用了+表示1位以上
而后面的用户id也是同理我认为他是一个数字所以用了[\d]而不知道他的具体位数所以用了+表示1位以上

除此之外要特别注意的是?,?在正则里表示0或1次,所以如果要匹配内容中的?那么就必须对正则里面的?进行转义用\?代替?这样就可以匹配内容中的?了(其他的在正则里有意义的符号同理)
以下为正则里有意义的符号

字符

说明

^

匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"

$

匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$"

( )

标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)"

[ ]

用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "\[" 和 "\]"

{ }

修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}"

.

匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."

?

修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?"

+

修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+"

*

修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*"

|

左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|"


以上为正则表达式的基础,有了这些基础简单的正则基本没有问题。

应用篇
应用篇将的为在c#中的几种常用的用法(就个人而言,我在c#中几种情况用的几种方法)
1.如何获取单个匹配项
2.如何获取多个匹配项
3.如何获取匹配项中的一部分
4.如何用正则表达式验证格式
5.如何替换符合正则的部分


1.如何获取单个匹配项
        string content = "123456789";
        string pat = "\\d";
        Regex regex = new Regex(pat);
        Match match = regex.Match(content);            // 获取匹配到的第一项
        content = match.ToString();
2.如何获取多个匹配项
        string content = "123456789";
        string pat = "\\d";
        Regex regex = new Regex(pat);
        MatchCollection matchCollection = regex.Matches(content);
        foreach (Match match in matchCollection)
        {
            match.ToString();                           // 获取匹配集合的每项
        }
3.如何获取匹配项中的一部分
        string content = "123456789";
        string pat = "1([\\d])3";
        Regex regex = new Regex(pat);
        MatchCollection matchCollection = regex.Matches(content);
        foreach (Match match in matchCollection)
        {
            foreach (Group group in match.Groups)
            {
                group.Value;                //通过group获取打括号的部分
            }
        }


4.如何用正则表达式验证格式
        string result = "";
        string content = "123456789";
        string pat = "1";                            // 内容中是否有1这个数字
        Regex regex = new Regex(pat);
        result +="content:"+ content+"pat:" + pat +"result:"+ regex.IsMatch(content).ToString()+"|";
        pat = "^1$";                                // 内容是否是1这个数字
        regex = new Regex(pat);
        result += "content:" + content + "pat:" + pat + "result:" + regex.IsMatch(content).ToString() + "|";
        pat = "^123456789$";                // 内容是否是123456789
        regex = new Regex(pat);
        result += "content:" + content + "pat:" + pat + "result:" + regex.IsMatch(content).ToString() + "|";
        pat = "^[\\d]*$";                        // 内容是否是纯数字
        regex = new Regex(pat);
        result += "content:" + content + "pat:" + pat + "result:" + regex.IsMatch(content).ToString() + "|";
        想办法显示下rusult看看结果把^^
ps:如果不写开始符号和结束符号代表的意思是验证的内容中有符合正则的项,如果打上开始符和结束符表示内容完全与正则匹配
5.如何替换符合正则的部分
        string result = "";
        string content = "123456789";
        string pat = "1";
        Regex regex = new Regex(pat);
        content = regex.Replace(content,"2");                        // 将内容中的1替换成2

以上就是我在c#中遇到的一些基本的处理方法。
posted @ 2008-05-27 01:51  小眼睛老鼠  阅读(1006)  评论(0编辑  收藏  举报