惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
爱范儿
爱范儿
T
The Exploit Database - CXSecurity.com
量子位
T
Tailwind CSS Blog
T
Threatpost
The GitHub Blog
The GitHub Blog
AWS News Blog
AWS News Blog
云风的 BLOG
云风的 BLOG
K
Kaspersky official blog
P
Proofpoint News Feed
博客园 - 司徒正美
L
LangChain Blog
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
S
Secure Thoughts
The Last Watchdog
The Last Watchdog
Spread Privacy
Spread Privacy
H
Hacker News: Front Page
T
Troy Hunt's Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google DeepMind News
Google DeepMind News
W
WeLiveSecurity
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Proofpoint News Feed
T
Tor Project blog
T
The Blog of Author Tim Ferriss
I
Intezer
P
Privacy & Cybersecurity Law Blog
美团技术团队
N
Netflix TechBlog - Medium
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Vulnerabilities – Threatpost
Application and Cybersecurity Blog
Application and Cybersecurity Blog
G
Google Developers Blog
Attack and Defense Labs
Attack and Defense Labs
T
Tenable Blog
月光博客
月光博客
Stack Overflow Blog
Stack Overflow Blog
J
Java Code Geeks
腾讯CDC
Microsoft Security Blog
Microsoft Security Blog
A
About on SuperTechFans
Last Week in AI
Last Week in AI

博客园 - 小诈

今日所思 伟大的意大利夺冠了!疯狂庆祝! word add-in 卸载时如何清除自定义的按钮和菜单 制作包含.net framework的安装包 解决不能上网的问题(Wincock绑架) [ASP.NET揭密读书笔记]额外的控件和资源 [ASP.NET揭密读书笔记]应用程序跟踪和监视 [ASP.NET揭密读书笔记]ADO.NET介绍 [ASP.NET揭密读书笔记]用户自定义控件 [ASP.NET揭密读书笔记]连接池 安装Ubuntu 痛苦的胃镜检查 [转载]微软好员工的十个标准 新年新气象,恭喜发财 WEB中服务器端Table的行集中要注意ViewState 2005年年终总结 招聘.NET高级软件工程师 DataTable.Select方法的性能问题 [转贴]Visual Studio 2005常用插件搜罗
[.net]正则表达式整理
小诈 · 2006-08-01 · via 博客园 - 小诈

正则表达式在处理字符串方面具有强大的优势,所以整理了一下主要的知识点,希望对大家有所帮助。通过这篇文章我们能够理清Match,Group,Capture的区别和联系。(如果您已经清楚,则没有读下去的必要了:p)

.net下正则表达式处于System.Text.RegularExpression 命名空间下,主要由几个类构成:Regex,Match,Group,Capture。

Regex表示只读的正则表达式类,它包含很多静态方法用于匹配,是我们调用正则表达式的起点。Match方法的介绍留到后面,这里先介绍一下Regex.Replace方法,应用该方法可以快捷的替换字符串。该方法有多个重载的列表,其中比较常用的有2个,一个是 Replace(string, string, string),最后一个string可以用"$1,2"等来表示用捕获的分组替换原来的字符串,例如string s = Regex.Replace(" abra ddd ", @"^\s*(.*?)\s(.*?)\s*$", "$2");则返回的是该输入的第二个分组的内容"ddd",关于分组看下面的match介绍。还有一个是Replace(string,MatchEvaluator),其中MatchEvaluator是一个签名为string (Match)的委托,那么我们就可以通过定义一个委托方法,来处理返回字符串。

Match表示匹配操作的结果。它返回通过正则表达式在输入串中匹配到的第一个结果。例如以abc(正则)匹配123abc456abc(输入),则会得到2个Match。所以我们直接调用Regex r = new Regex("abc");Match m = r.Match("123abc456abc");则返回的m只有第一个abc,所以如果我们想得到第一个匹配时可以调用一次Match就可以了。如果我们想遍历所有的匹配,则需要使用Matches方法返回MatchCollection来遍历,或者用Match方法做一个循环。例如MatchCollection mathes =r.Matches(……);或者while(m.Success){……;m = m.NextMatch();}

当然我们不会只写这么简单的正则表达式,很多时候需要做一些分组来方便字符串的处理,这就用到了Group和GroupCollection。我们在用正则表达式进行匹配时,始终默认整个正则表达式作为第一个分组(Group),例如"a((b)c)",就包含3个Group:abc,bc,b(从左至右),这3个Group构成了这个Match的GroupCollection。由于正则表达式的元字符的原因,每个Group又可能包含若干个捕获(Capture),例如用"(abc)+"匹配"abcabcabcddd"时,就得到2个Group,第一个是默认的整个正则表达式匹配的分组(abcabcabc),由于整个表达式默认执行的是贪婪匹配,所以匹配了最多可能的abc串,所以这个group只有一个capture。第二个Group是用分组"(abc)+"来捕获的,由于存在3个abc所以他捕获了3个Capture,分别为3个abc。直接访问Group.Value,返回的则是该组最后一个Capture的值。

举例:通过这个例子可以熟悉怎么读取匹配的结果。

例子程序

将会产生如下输出:
Captured groups = 2
Captures count = 1
AbcAbcAbc   Starts at character 3
Captures count = 3
Abc   Starts at character 3
Abc   Starts at character 6
Abc   Starts at character 9

附录:
正则表达式测试工具:http://regulator.sourceforge.net/
关于正则表达式的写法:http://www.cnblogs.com/mancini/archive/2005/03/21/122819.html