C#实现正则表达式
如果想了解正则表达式的基础知识:http://www.cnblogs.com/alvin-niu/p/6430758.html
一、C#中的Regex类
1.在C#中开发正则表达式,首先要引用System.Text.RegularExpressions.Regex命名空间。
二、Regex中常用的方法
此处先介绍一些Regex的静态方法。
1.Match(String content,String pattern):在指定的输入字符串中搜索指定的正则表达式的第一个匹配项,
content:要匹配的字符串。
pattern:正则表达式。
返回值:Match 对象。
2.Match(String content,String pattern,RegexOption option):使用指定的匹配选项在输入字符串中搜索指定的正则表达式的第一个匹配项。
option:指定的匹配选项,该项能大大提高匹配效率,在匹配量比较小的时候可以不需考虑。
| 枚举值 | 详细说明 |
| Compiled | 指定将正则表达式编译为程序集。 这会产生更快的执行速度,但会增加启动时间。 |
| CultureInvariant | 指定忽略语言中的区域性差异 |
| ECMAScript | 为表达式启用符合 ECMAScript 的行为。 可以使用此值仅在结合 IgnoreCase, ,Multiline, ,和 Compiled 值。 该值与其他任何值一起使用均将导致异常。 |
| ExplicitCapture | 指定唯一有效的捕获是显式命名或编号的 (?<name>…) 形式的组。 这使未命名的圆括号可以充当非捕获组,并且不会使表达式的语法 (?:...) 显得笨拙。 如果不懂分组,可以先忽略,看下面的。 |
| IgnoreCase | 指定不区分大小写的匹配。 |
| IgnorePatternWhitespace | 消除模式中的非转义空白并启用由 # 标记的注释。 但是,此值不会影响或消除中的空白区域、 数值或标记的开头个人的令牌。 |
| Multiline | 多行模式。 更改 ^ 和 $ 的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。 |
| None | 指定不设置任何选项。 这种也是默认的模式 |
| RightToLeft | 指定搜索从右向左而不是从左向右进行。 |
| Singleline | 指定单行模式。 更改点 (.) 的含义 使其匹配 (而不是除 \n 之外的所有字符) 的每个字符。 |
返回值:Match 对象。
3.Match(String content,String pattern,RegexOption option,TimeSpan ts):使用指定的匹配选项和超时间隔在输入字符串中搜索指定的正则表达式的第一个匹配项。
ts:超时时间间隔。
返回值:Match 对象。
在此处穿插一个知识点,Match 对象,但是只介绍常用的属性
Match 对象:主要存放正则匹配之后的数据。
Groups:获取由正则表达式匹配的组的集合。Groups[0]表示原字符串。Groups[1]才表示匹配的第一个分组的子字符串
Index:在其中找到被捕获子串的第一个字符的原始字符串中的位置。
Length:获取捕获的子字符串的长度。
Name:返回由当前实例表示的捕获组的名称。
Success:获取一个值,该值指示匹配是否成功。
Value:从输入字符串中获取捕获的子字符串。
-----------------------------------------------------------------------------------------------
4.IsMatch(String content,String pattern):表示是否匹配到相应的正则表达式,其重载方法与Match()一样
5.Matches(String content,String pattern):在指定的输入字符串中搜索指定的正则表达式的多个匹配项,其重载方法与Match()一样
返回值:MatchCollection 对象。该对象其实是Match的对象集合
上述方法,是我在开发爬虫程序最常用的方法之一。在解析数据时,要匹配多个类似规律的数据。
6.Replace(String content,String pattern,MatchEvaluator evaluator):在置顶的输入字符串搜索置顶的正则表达式的匹配项,在将evaluator委托的方法中,将返回替换了匹配的输入字符串。将原字符串中匹配项替换掉
evaluator:委托对象,原型:public string MatchEvaluatorMethod(Match match);自定义方法返回替换了匹配的输入字符串。
此处比较难懂,写个例子
这个例子中主要体现了,只要在输入字符串中找到正则的匹配项,则执行委托的方法。该方法返回值会替换掉原来的匹配项。再接着搜索,直到替换掉所有的匹配项。该方法可以用到Match对象,但是此处例子为了简洁明了,则直接返回了一个字符串,和表示执行次数的count
using System;
using System.Collections;
using System.Text.RegularExpressions; public class Test
{
private static int count = ;
public static void Main()
{
string words = "TOM123456JACK654321Alvin90293";
string pattern = @"\d+";
MatchEvaluator evaluator = new MatchEvaluator(WordScrambler);
Console.WriteLine("Original words:");
Console.WriteLine(words);
Console.WriteLine();
Console.WriteLine("Scrambled words:");
Console.WriteLine(Regex.Replace(words, pattern, evaluator));
Console.ReadKey();
}
//委托的实现方法
public static string WordScrambler(Match match)
{
count++;
return "数字"+count;
}
}
有关Replace()的例子
7.Repalce()还有一些重载方法,其原理和Match()方法类似,懂的一个其他的自然就懂了,此处我列举一下就不一一说明了。
Replace(String content,String pattern,MatchEvaluator evaluator,RegexOption option);
Replace(String content,String pattern,MatchEvaluator evaluator,RegexOption option,TimeSpan ts);
Replace(String content,String pattern,String newStr);该方法表示直接使用newStr替换匹配到的子字符串。
Replace(String content,String pattern,String newStr,RegexOption option);
Replace(String content,String pattern,String newStr,RegexOption option,TimeSpan ts);
8.Split(String content,String pattern):在由正则表达式模式定义的位置将输入字符串拆分为一个子字符串数组
其重载方法有:
Split(String content,String pattern,RegexOption option);
Split(String content,String pattern,RegexOption option,TimeSpan ts);
常用的就是这些静态方法,至于那些非静态方法,我至今还没有用到过,所以就不在此赘述了。下面给一个详细的例子:
三、实例
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions; public class Test
{
public static void Main()
{
//匹配字符串中邮箱
string pattern = @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
string content = "qq邮箱:1234567@qq.com。网易邮箱:wangyi@163.com。公司邮箱:tom@gongsi.com.cn 。";
Match result = Regex.Match(content,pattern);
Console.WriteLine(result.Value);//匹配第一个 1234567@qq.com
pattern = @":(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*?)。";
result = Regex.Match(content, pattern);
Console.WriteLine(result.Value);//匹配结果 :wangyi@163.com。
Console.WriteLine(result.Groups[]);//匹配结果 :wangyi@163.com。
Console.WriteLine(result.Groups[]);//匹配结果 wangyi@163.com
pattern = @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
MatchCollection matches = Regex.Matches(content, pattern, RegexOptions.IgnoreCase);
foreach (Match item in matches)
{
Console.WriteLine(item.Value);
}
Console.WriteLine(Regex.Replace(content,pattern,"The Email is ignore"));
string [] array= Regex.Split(content,"[::。]");
foreach (var item in array)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
以上所有知识点的例子
以上皆本人系统整理所学知识的笔记,与之共享。
C#实现正则表达式的更多相关文章
- JS正则表达式常用总结
正则表达式的创建 JS正则表达式的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 var regObj = new RegExp("(^\\s+) ...
- Python高手之路【五】python基础之正则表达式
下图列出了Python支持的正则表达式元字符和语法: 字符点:匹配任意一个字符 import re st = 'python' result = re.findall('p.t',st) print( ...
- C# 正则表达式大全
文章导读 正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串.正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法.Regex 类表示不可变(只读)的 ...
- C#基础篇 - 正则表达式入门
1.基本概念 正则表达式(Regular Expression)就是用事先定义好的一些特定字符(元字符)或普通字符.及这些字符的组合,组成一个“规则字符串”,这个“规则字符串”用来判断我们给定的字符串 ...
- JavaScript正则表达式,你真的知道?
一.前言 粗浅的编写正则表达式,是造成性能瓶颈的主要原因.如下: var reg1 = /(A+A+)+B/; var reg2 = /AA+B/; 上述两个正则表达式,匹配效果是一样的,但是,效率就 ...
- Python 正则表达式入门(中级篇)
Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...
- 【JS基础】正则表达式
正则表达式的() [] {}有不同的意思. () 是为了提取匹配的字符串.表达式中有几个()就有几个相应的匹配字符串. (\s*)表示连续空格的字符串. []是定义匹配的字符范围.比如 [a-zA-Z ...
- JavaScript 正则表达式语法
定义 JavaScript定义正则表达式有两种方法. 1.RegExp构造函数 var pattern = new RegExp("[bc]at","i"); ...
- [jquery]jquery正则表达式验证(手机号、身份证号、中文名称)
数字判断方法:isNaN()函数 test()方法 判断字符串中是否匹配到正则表达式内容,返回的是boolean值 ( true / false ) // 验证中文名称 function isChin ...
- JS中给正则表达式加变量
前不久同事询问我js里面怎么给正则中添加变量的问题,遂写篇博客记录下. 一.字面量 其实当我们定义一个字符串,一个数组,一个对象等等的时候,我们习惯用字面量来定义,例如: var s = &quo ...
随机推荐
- Python版的数据库查询构造器、ORM及动态迁移数据表。
Orator Orator提供一个简单和方便的数据库数据处理库. 它的灵感来源于PHP的Laravel框架,借助其思想实现了python版的查询构造器和ORM. 这是完整的文档:http://orat ...
- 通过Python调用Spice-gtk
序言 通过Virt Manager研究学习Spice gtk的Python方法 你将学到什么 Virt Manager研究 显示代码定位 首先我们使用Virt Manager来观察桌面连接窗口 然后我 ...
- Python中的变量,数据类型
Python中变量的命名规则:以字母和下划线开头,由字母,数字和下划线组成,区分大小写 Python中同样有加减乘除取余运算,还有一个运算符**,相当与幂运算,当然,幂运算的优先级要高于加减乘除 最后 ...
- PHP现阶段发现的不足点
1.php测试单元的实现(参考文档:https://blog.csdn.net/weixin_41282397/article/details/85052015)
- Go:坑之for range
go只提供了一种循环方式,即for循环,在使用时可以像c那样使用,也可以通过for range方式遍历容器类型如数组.切片和映射.但是在使用for range时,如果使用不当,就会出现一些问题,导致程 ...
- 2018上海大都会邀请赛J(数位DP)
#include<bits/stdc++.h>using namespace std;int num[20];//按位储存数字int mod;long long dp[20][110][1 ...
- java实例练习——基于TCP/IP协议的多客户端通信
先说一下大概的思路: 应用多线程来实现服务器与多客户端之间的通信 1.服务器端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建一个Socket并请求与服务器端连接 ...
- 外企面试,哪有你想象的那么难!(已收埃森哲、NTTDATA等8家外企offer)
无精疯,一名背包客,大学期间穷游了十余个国家,五十余座城市,也是一位拥有健身教练证的业余健身痴迷者.从大二开始自学Java并开始了第一份实习,后面也是通过自学转到了大数据,之前在一家大数据独角兽实习, ...
- Python Day24
AJAX 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 1.传统的Web应用 一个简单操作 ...
- centos7安装配置docker
1. 安装/升级Docker客户端 Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . uname -r 从 ...