[原创]正则表达式在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
但是由于里面写的太全所以不知道那些是重点那些不是(其实都是重点只不过有些我们用不到而已)
这里我就把我认为比较重要也比较基础实用的一些基本用法列举出来
一开始只要了解一下这些就基本够用了
代码 | 说明 |
---|---|
. | 小数点可以匹配除了换行符(\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(组的概念以后再解释)
通过以上例子基本能够了解常用原字符的范围以及用处
但是仅仅拥有常用的原字符还不够,常用原字符只能匹配单个字符
如果遇到要匹配多个同类字符就必须用到常用限定符
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{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#中遇到的一些基本的处理方法。
转载于:https://www.cnblogs.com/clhed/archive/2008/05/27/1208049.html
[原创]正则表达式在c#中的学习和应用相关推荐
- java 正则 捕获_Java通过正则表达式捕获组中的文本
1.简介 Java 正则表达式如何捕获组中的文本 ?--请看下文. 2.代码 /** * 版权所有 编程十万个怎么办(www.tah1986.com) */ public class Capturin ...
- java a标签正则_正则表达式:java中婚配HTML中a标签中的中文字符
正则表达式:java中匹配HTML中a标签中的中文字符 今天群里一位朋友问到了一个正则表达式的问题,有如下内容: 特432 453543 a1特123你好123吗? 特2 标签中的文字现在要匹配出内容 ...
- php 获取字符串中的url,php使用正则表达式获取字符串中的URL
今天写一个问答系统上线之后发现有很多人发链接了,由于业务部门要我们过滤掉网站地址了,下面我给大家分享一个提取字符串url地址函数,代码如下:$str ='本文实例讲述了php匹配字符串里所有URL地址 ...
- 正则表达式必知必会学习笔记
正则表达式必知必会学习笔记 @(正则表达式)[regex,正则表达式,正则] 基本概述 <正则表达式必知必会>是一本很薄的书,花了两个小时左右将全书通读了一遍.这本书基本将正则表达式的常用 ...
- 使用正则表达式提取文件中满足条件的内容
最近遇到需要处理一个很大文件的情况,需求是提取满足以`(ASCII 十进制 96)开头'结束的字符串,例如xxxxx`abcdedg'. 尝试在shell脚本中用正则表达式提取.有点曲折,后来通过py ...
- 由浅入深的正则表达式教程,简单快速学习正则
文章目录 前言 正则表达式是什么 字符串匹配方法 match() 字符串检查方法 test() 正则表达式语法 ^ 和 $ 的用法和区别详解 限定符 普通字符 特殊字符 元字符 运算符优先级 常用的正 ...
- Python使用正则表达式识别代码中的中文、英文和数字实例演示
Python 正则表达式识别代码中的中文.英文和数字 识别中文 识别英文 识别数字 拓展 在文本处理和数据分析中,有时候需要从代码中提取出其中包含的中文.英文和数字信息.正则表达式是一种强大的工具,可 ...
- 从vue-element-admin框架中,学习如何优雅地使用icon
前言: 本文主要记录一下,从vue-element-admin框架中,学习到使用icon的经验.希望以后,可以运用到自己的项目中. 一.前端icon的发展史 在远古时代,大部分图表都是用img来实现的 ...
- c#使用正则表达式获取TR中的多个TD_[Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例...
首先祝大家中秋节和国庆节快乐,欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都 ...
最新文章
- 人生感悟:一个男人必须具有的东西
- Leetcode 876. 链表的中间结点 (每日一题 20210918)
- linux系统的运行定义在,Linux系统运行级管理
- 怎样与用户有效的沟通以获取用户的真实需求
- 9.2NOIP模拟题
- 高等数学张宇18讲 第十讲 多元函数微分学
- wpdec函数_小波包分解常用函数
- java apktool if_apktool反编译详细使用教程
- Spotfire 设置 组合图表的刻度范围
- Qt的对话框与窗口--标准的对话框
- DZY Loves Chinese/DZY Loves Chinese II 题解
- H.264的两个概念:DC系数和AC系数
- Hash函数经典用法
- IP对亚马逊测评自养号有多重要?
- C++程序设计同步实践宝典——前言
- 计算机软件也有“五大部分”
- xmlhttp = new XMLHttpRequest();
- Hashtable的用法
- D. Sonya and Matrix
- Scrapy第十五篇:后起之秀-Playwright
热门文章
- python和java哪个-Python和Java哪个好?有什么区别?
- python读取txt文件代码-python批量处理txt文件的实例代码
- python数字类型-Python数字类型有哪些
- 零基础学编程学java还是python-小白学编程选java、php、前端还是python
- python实现简单的api接口-使用Python编写API接口和使用API接口
- python官网下载哪个版本-python下载哪个版本好
- 下面不属于python第三方库的安装方法的是-Python第三方库安装和卸载
- python画散点图分布-python画时间序列散点图
- python绘制三维散点图-python 画三维图像 曲面图和散点图的示例
- 学python是看书还是看视频-Python与豆瓣读书