C#正则表达式_第1页
C#正则表达式_第2页
C#正则表达式_第3页
C#正则表达式_第4页
C#正则表达式_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#正则表达式(RegEx)高级应用之分组(Group)替换(Replace)今天,说一下 .NET 里面 正则 使用的稍微高级一些的技巧:分组替换 ,下面我们举两个实例来说明这个问题:一段字符串,把其中出现的 Ax,Ay 形式的内容,替换为 Ax 的形式(也就是 ,和Ay 都不要了),其中x 和y是数字,位长是 12,并且不会出现连排的形式对于上面的需求,我们进行分析后,可以得出:上面的匹配规则,分为2组,(Ax) 一组,(,Ay) 一组 匹配后,直接返回第一组就OK了对于.NET来说,分组替换的实现,有多种方式,我这里展示其中的2种,对于上面的例子,我使用 MatchEvaluator 方式static string CustomReplace(System.Text.RegularExpressions.Match m) return m.Groups1.Value; /直接返回分组1string sourceString = .;string pattern = (Ad1,2)(,Ad1,2);System.Text.RegularExpressions.MatchEvaluator myEvaluator = new System.Text.RegularExpressions.MatchEvaluator(CustomReplace);System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(pattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase| System.Text.RegularExpressions.RegexOptions.Multiline); string resultString = reg.Replace(sourceString, myEvaluator); 一段HTML代码,是用来插入FLASH的,形式如: 需求是需要对这个FLASH的代码进行自定义,将 宽度 替换为自定义的值对于这个例子,我们使用分组号 $# 的方式来实现,#代表数字,经过分析,可以得出,将上面的内容,分为3组string sourceString = .;string toWidth = 300; /自定义的宽度string pattern = (embed .+? widths0,=s0,0,1)(d+)(0,1);System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline);string resultString = reg.Replace(sourceString, $1 + toWidth + $3); 为了区分分组编号和普通字符,可以用标注分组号字号:大 中 小 文章来源: /articles/matchevaluator.htmlUsing a MatchEvaluator with Regex.Replace The regular expression engine in .NET is obviously a powerful alternative to traditional String manipulation methods when dealing with complex parsing or validation. The power of the Regex.Replace method allows the developer to perform replacements based on patterns rather than literal text. Beyond this, though, .NET Regex offers an even more powerful tool - the MatchEvaluator.A MatchEvaluator is simply a pointer to a function that takes a Match as its only parameter and returns a String. When calling Regex.Replace, you can then pass the MatchEvaluator instead of a replacement string, and .NET will call your MatchEvaluator and then use the returned Strnig as the result of the Replace. This offers the ability to perform complex parsing withing a call to Replace, including the ability to reference other methods and classes. One common example is an expression evaluator. You may want to replace the String 3*2 with 6 in an expression. The following code shows how to do this simple example using a MatchEvaluator: Public Function EvaluateString(ByVal s As String) As String Dim MatchEval As New MatchEvaluator(AddressOf RegexReplaceEvaluator) Dim Pattern As String = (?d+)(?+|-|/|*)(?d+) Return Regex.Replace(s, Pattern, MatchEval) End Function Public Function RegexReplaceEvaluator(ByVal m As Match) As String Select Case m.Groups(sign).Value Case + Return (CInt(m.Groups(param1).Value) + _ CInt(m.Groups(param2).Value).ToString Case - Return (CInt(m.Groups(param1).Value) - _ CInt(m.Groups(param2).Value).ToString Case / Return (CInt(m.Groups(param1).Value) / _ CInt(m.Groups(param2).Value).ToString Case * Return (CInt(m.Groups(param1).Value) * _ CInt(m.Groups(param2).Value).ToString Case Else Return ERROR End Select End Function This is a simplified example, but it shows how a MatchEvaluator can be used to perform operations that would be much more complex with standard parsing methods. For those who want to realize the full power of the MatchEvaluator, check out Chapter 12 of Francesco Balenas book, Programming Visual Basic .NET, in which he offers code that will evaluate complex expressions with nested levels of parentheses, logarithmic functions, and trigonometric functions.Note also that you do not need to declare a MatchEvaluator object. The Regex.Replace method will also take a delegate within the call itself like this:Return Regex.Replace(s, Pattern, AddressOf RegexReplaceEvaluator) 最近在学习xml的时候遇上这样一个问题。读取mp3信息然后录入到数据库中的xml字段。然而mp3信息中,如在标题中存在这样一种特殊情况: 标题包含XML的特殊字符而导致输入出错. 如: Killem All 中的 You&Me 中的& 还有其他一些诸如等等. 利用正则表达式找出特殊字符我们当然可以轻易地利用正则表达式查找出那些特殊字符并用Replace()替换掉他们, 如下: using System.Text.RegularExpressions;public class Test. static void Main(string args) . string str = ; string result; /假设特殊字符只有 & 四种 string pattern = |&: Regex regex = new Regex(pattern); /假设我们只把他们都替换成 _ result = regex.Replace(str, _); Console.WriteLine(result); /结果很明显_You_re angle _ evil_按情况替换为不同的字符但我遇到的问题是, 我可不想把他们简单的替换成一个没意义的下划线,我想把他们转化为xml能识别的格式。不幸地,Replace可不直接提供替换为多个目标字符的功能。于是, 我们可以用到一个叫MatchEvaluatord的类来帮我们解决问题。如下:using System.Text.RegularExpressions;class Program . static void Main(string args) . string str = ; string pattern = |&|; Regex regex = new Regex(pattern); Program prog = new Program(); MatchEvaluator evaluator = new MatchEvaluator(prog.ConvertToXML); Console.WriteLine(regex.Replace(str, evaluator); Console.Read(); /把正则表达式的匹配到的字符转换成xml能正常识别的标识 public string ConvertToXML(Match m) . switch (m.Value) . case : return ' case &: return & case : return > default: return ; 不知此法是否最佳, 还望各位赐教.C#正则表达式语法一、匹配单个字符 从中选择一个字符匹配中间支持的类型:单词字符(ae)、非单词字符(!?,;#$*)、字母范围(A-Z)、数字范围(0)eg.正则表达式可匹配字符串 aeffectaffect,effect(此例中ae为元字符,ffect为字母文本)注意:1.要在字符类中匹配连字符,那么把连字符号作为第一个字符列出即可。2.可以在单个正则表达式中包含多个字符类。eg.010-9:0-50-9apm可以用来匹配如12:59pm格式的所有时间排除某些字符(在中表此意,还可表示字符串的开头)eg.正则表达式可匹配字符串不可匹配字符串 matmet,mit,m&tmatC#正则表达式语法二、匹配特殊字符 可以使用的特殊字符:t匹配制表符 r匹配硬回车符 f匹配换页符 n匹配换行符 描述表示字符类的元字符:.匹配任何除了n以外的字符(或者在单行模式中的任何字符) w匹配任何单词字符(任何字母或数字) W匹配任何非单词字符(除了字母和数字以外的任何字符) s匹配任何空白字符(包括空格、换行、制表符等) S匹配任何非空白字符(除了空格、换行、制表符等的任何字符) d匹配任何数字字符(09的数字) D匹配任何非数字字符(除了09以外的任何字符) 表示字符串中字符位置: 匹配字符串的开头(或者多行模式下行的开头)。 $匹配字符串的结尾,或者是字符串结尾“n”之前的最后一个字符,或者是多行模式中的行结尾。 A匹配字符串的开头(忽略多行模式) Z匹配字符串的结尾或字符串结尾“n”之前的最后一个字符(忽略多行模式)。 z匹配字符串的结尾。 G匹配当前搜索开始的位置。 b匹配单词的边界。 B匹配单词的非边界。 注意:1.句点字符(.)特别有用。可以用它来表示任何一个字符。eg.正则表达式可匹配字符串 01.17.8401/17/84,01-17-84,011784,01.17.842.可以使用b匹配单词的边界eg.正则表达式可匹配字符串不可匹配字符串 bletbletletter,hamlet3.A和z在确保字符串所包含的是某个表达式,而不是其他内容时很用。eg.要判断Text控件是否包含单词sophia,而不含任何额外的字符、换行符或者空白。Asophiaz4.句点字符(.)具有特殊的含义,若要表示字母字符本身的含义,在前面加一个反斜杠:.C#正则表达式语法三、匹配而选一的字符序列|匹配二选一eg.正则表达式可匹配字符串 col(o|ou)rcolor,colour注意:b(bill|ted)和bbill|ted是不同的。后者还可以匹配malted因为b元字符只应用于bill。C#正则表达式语法四、用量词匹配 *匹配0次或多次 +匹配1次或多次 ?匹配0次或1次 n恰好匹配n次 n,至少匹配n次 n,m至少匹配n次,但不多于m次 eg.正则表达式可匹配字符串 brothers?brother,brotherseg.正则表达式可匹配字符串 bpd3,5b以p开头,且后跟35个数字结尾注意:也可以把量词与()一起使用,以便把该量词应用到整个字母序列。eg.正则表达式可匹配字符串 (The)?schoolisbeautiful.schoolisbeautiful,Theschoolisbeautiful.C#正则表达式语法五、识别正则表达式和贪婪 有些量词是贪婪的(greedy).他们会尽可能多的匹配字符。如量词*匹配0个或多个字符。假设要匹配字符串中任何HTML标签。你可能会用如下正则表达式:现有字符串Aquantifiercanbegreedy结果把quantifiercanbegreedy都匹配上了。要解决该问题,需要与量词一起使用一个特殊的非贪婪字符“?”,因此表达式变化如下:这样就可以正确匹配、。?能强制量词尽可能少地匹配字符,?还可以用在以下几个量词中:*?非贪婪的量词* +?非贪婪的量词+ ?非贪婪的量词? n?非贪婪的量词n n,?非贪婪的量词n, n,m?非贪婪的量词n,m 六、捕获和反向引用 捕获组(capturegroup)就像是正则表达式中的变量。捕获组可以捕获正则表达式中的字符模式,并且由正则表达式后面的编号或名称来引用改模式。()用来捕获其中的字符串数字用编号来引用eg.正则表达式可匹配字符串 (w)(w)21abba注意:1.反向引用用来匹配html标签非常有效如可以匹配等类似格式的标签。2.默认情况下,只要使用圆括号,就会捕获圆括号内所包含的字符,可以使用n选项来禁用这个默认行为(在第7条里会详细介绍),或者添加?:到圆括号中。eg.(?:sophia)或(?n:sophia)此时不会捕获sophia。(?)k用名称来引用eg.正则表达式可匹配字符串 (?w)abckxabcx注意:在替换模式中使用捕获组的格式略有不同,要用$1、$2等来按数值引用捕获,用$sophia等名称来按名称引用捕获组七、设置正则表达式的选项eg.stringstr=sophiaRegExobjRegEx=newRegEx(.*?); Response.Write(objRegEx.Replace(str,$2);i所执行的匹配是不区分大小写的(.net中的属性为IgnoreCase) m指定多行模式(.net中的属性为Multiline) n只捕获显示命名或编号的组(.net中的属性为ExplicitCapture) c编译正则表达式,这样会产生较快的执行速度,但启动会变慢(.net中的属性为Compiled) s指定单行模式(.net中的属性为SingleLine) x消除非转义空白字符和注释(.net中的属性为IgnorePatternWhitespace) r搜索从右到左进行(.net中的属性为RightToLeft) -表示禁用。 eg.(?im-r:sophia)允许不区分大小写匹配sophia,使用多行模式,但禁用了从右到左的匹配。注意:1.m会影响如何解析起始元字符()和结束元字符($)。在默认情况和$只匹配整个字符串的开头,即使字符串包含多行文本。如果启用了m,那么它们就可以匹配每行文本的开头和结尾。2.s会影响如何解析句点元字符(.)。通常一个句点能匹配除了换行符以外的所有字符。但在单行模式下,句点也能匹配一个换行符。VS2008替换字符串a_aa-a_aaa-zA-Z+_a-zA-Z+1正则表达式匹配任意字符(包括换行符)的写法 今天在Java中想使用正则表达式来获取一段文本中的任意字符。于是很随意得就写出如下匹配规则: (.*) 结果运行之后才发现,无法获得换行之后的文本。于是查了一下手册,才发现正则表达式中,“.”(点符号)匹配的是除了换行符“n”以外的所有字符。同时,手册上还有一句话:要匹配包括 n 在内的任何字符,请使用像 .n 的模式。于是我将正则表达式的匹配规则修改如下: (.n*),当然,如果是在java程序中直接写到话,需要改为(.n*) 结果再次运行程序,发现什么内容也取不到了。我百思不得其解,又将其修改为如下规则: (.|n*) 以及 (n.*) 结果还是不行,什么内容都取不到。看来点符号和换行符卯上劲了 然后上网一查,虽然没有查出上述规则到底是什么地方出问题了,但是查出了一个解决办法,经过一试,果然可以匹配包括换行符在内的任意字符,以下为正确的正则表达式匹配规则: (sS*) 同时,也可以用 “(dD*)”、“(wW*)” 来表示。 在文本文件里, 这个表达式可以匹配所有的英文 / -/ 这个表达式可以匹配所有的非英文(比如中文) / -/ 常用的C#正则表达式! d+$ /非负整数(正整数 + 0) 0-9*1-90-9*$ /正整数 (-d+)|(0+)$ /非正整数(负整数 + 0) -0-9*1-90-9*$ /负整数 -?d+$ /整数 d+(.d+)?$ /非负浮点数(正浮点数 + 0) (0-9+.0-9*1-90-9*)|(0-9*1-90-9*.0-9+)|(0-9*1-90-9*)$ /正浮点数 (-d+(.d+)?)|(0+(.0+)?)$ /非正浮点数(负浮点数 + 0) (-(0-9+.0-9*1-90-9*)|(0-9*1-90-9*.0-9+)|(0-9*1-90-9*)$ /负浮点数 (-?d+)(.d+)?$ /浮点数 A-Za-z+$ /由26个英文字母组成的字符串 A-Z+$ /由26个英文字母的大写组成的字符串 a-z+$ /由26个英文字母的小写组成的字符串 A-Za-z0-9+$ /由数字和26个英文字母组成的字符串 w+$ /由数字、26个英文字母或者下划线组成的字符串 w-+(.w-+)*w-+(.w-+)+$ /email地址 a-zA-z+:/(w+(-w+)*)(.(w+(-w+)*)*(?S*)?$ /url /(d2|d4)-(0(1-91)|(11|2)-(0-2(1-91)|(30|1)$/ / 年-月-日 /(0(1-91)|(11|2)/(0-2(1-91)|(30|1)/(d2|d4)$/ / 月/日/年 (w-.+)(0-91,3.0-91,3.0-91,3.)|(w-+.)+)(a-zA-Z2,4|0-91,3)(?)$ /Emil (d+-)?(d4-?d7|d3-?d8|d7,8)(-d+)? /电话号码 (d1,2|1dd|20-4d|250-5).(d1,2|1dd|20-4d|250-5).(d1,2|1dd|20-4d|250-5).(d1,2|1dd|20-4d|250-5)$ /IP地址 YYYY-MM-DD基本上把闰年和2月等的情况都考虑进去了 (16-9|2-9d)d2)-(0?13578|102)-(0?1-9|12d|301)|(16-9|2-9d)d2)-(0?13456789|1012)-(0?1-9|12d|30)|(16-9|2-9d)d2)-0?2-(0?1-9|1d|20-8)|(16-9|2-9d)(048|2468048|1357926)|(16|2468048|357926)00)-0?2-29-)$ C#正则表达式 图片 src*/.(?:jpg|bmp|gif)(?:|) 中文 (u4e00-u9fa5+|a-zA-Z0-9+)$ 网址 foundAnchor+?)*? 匹配中文字符的正则表达式: u4e00-u9fa5 匹配双字节字符(包括汉字在内):x00-xff 匹配空行的正则表达式:ns| *r 匹配HTML标记的正则表达式:/.*|/ 匹配首尾空格的正则表达式:(s*)|(s*$)(像vbscript那样的trim函数) 匹配Email地址的正则表达式:w+(-+.w+)*w+(-.w+)*.w+(-.w+)* 匹配网址URL的正则表达式:http:/(w-+.)+w-+(/w- ./?%&=*)? - 以下是例子: 利用正则表达式限制网页表单里的文本框输入内容: 用正则表达式限制只能输入中文:onkeyup=value=value.replace(/u4E00-u9FA5/g,) onbeforepaste=clipboardData.setData(text,clipboardData.getData(text).replace(/u4E00-u9FA5/g,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论