.net正则中的字符转义

上传人:wt****50 文档编号:39963534 上传时间:2018-05-21 格式:DOC 页数:16 大小:72KB
返回 下载 相关 举报
.net正则中的字符转义_第1页
第1页 / 共16页
.net正则中的字符转义_第2页
第2页 / 共16页
.net正则中的字符转义_第3页
第3页 / 共16页
.net正则中的字符转义_第4页
第4页 / 共16页
.net正则中的字符转义_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《.net正则中的字符转义》由会员分享,可在线阅读,更多相关《.net正则中的字符转义(16页珍藏版)》请在金锄头文库上搜索。

1、.NET 正则中的字符转义 1 概述概述这或许会是一个让人迷惑,甚至感到混乱的话题,但也正因为如此,才有了讨论的必要。在正则中,一些具有特殊意义的字符,或是字符序列,被称作元字符,如“?”表示被修饰的子表达式匹配 0 次或 1 次, “(?i)”表示忽略大小写的匹配模式等等。而当这些元字符被要求匹配其本身时,就要进行转义处理了。不同的语言或应用场景下,正则定义方式、元字符出现的位置不同,转义的方式也是林林总总,不一而同。2 .NET 正则中的字符转义正则中的字符转义2.1 .NET 正则中的转义符正则中的转义符绝大多数语言中, “/”都被作为转义符,用来转义一些具有特殊意义的字符或字符序列,比

2、如“/n”表示换行, “/t”表示水平制表符等。而这样的转义,应用到正则中,又会有一些意想不到的变化。话题由 C#中一个正则问题引出string test = new string“/“, “/“;Regex reg = new Regex(“/$“);foreach (string s in test)richTextBox2.Text += “源字符串: “ + s.PadRight(5, ) + “匹配结果: “ + reg.IsMatch(s) + “/n“;/*-输出-源字符串: / 匹配结果: True源字符串: / 匹配结果: False*/对于这个结果,或许有人会感到迷惑,字符

3、串中的“/”不是代表一个经过转义的“/”字符吗?而“/”不就应该代表两个经过转义的“/”字符吗?那么上面正则匹配的结果应该是第一个为False,第二个为 True 才对啊?对于这一问题,直接解释或许不太容易理解,还是换种方式来解释吧。比如要匹配的字符是这样的string test = “(“;那么正则如何写呢?因为“(”在正则中是有特殊意义的,所以写正则时必须对它进行转义,也就是“/(”,而在字符串中,要使用“/” 来表示“/”本身,也就是Regex reg = new Regex(“/($“);这个如果理解了,那再把“(”换回“/”,同样道理,在字符串中,要使用“/” 来表示“/”本身,也就

4、是Regex reg = new Regex(“/$“);通过这样的分析,可以看出,其实在以字符串形式声明的正则中, “/”匹配的实际上就是单独的一个“/”字符。总结一下它们之间的关系:输出到控制台或界面的字符串:/程序中声明的字符串:string test = “/“;程序中声明的正则:Regex reg = new Regex(“/$“);这样解释是不是已经可以理解了,那么是不是感觉这样很笨拙?是的,在程序中以字符串形式声明的正则,涉及到转义符时就是这样笨拙的。所以在 C#中,还提供了另一种字符串声明方式,在字符串前加个“”,就可以忽略转义。string test = new string

5、 “/“, “/“ ;Regex reg = new Regex(“/$“);foreach (string s in test)richTextBox2.Text += “源字符串: “ + s.PadRight(5, ) + “匹配结果: “ + reg.IsMatch(s) + “/n“;/*-输出-源字符串: / 匹配结果: True源字符串: / 匹配结果: False*/这样就简洁多了,也符合通常的理解。但同时也带来另一个问题,就是双引号的转义处理。在普通的字符串声明中,可以用“/”对双引号进行转义。string test = “only a test“;但是在字符串前加了“”后,

6、 “/”会被识别为“/”字符本身,这样就不能用“/”对双引号进行转义了,需要用“”对双引号进行转义。string test = “only a test“;而在 VB.NET 中,正则的定义只有一种形式,与 C#中加了“”后的定义方式是一致的。Dim test As String() = New String() “/“, “/“Dim reg As Regex = New Regex(“/$“)For Each s As String In testRichTextBox2.Text += “源字符串:“ Regex reg = new Regex(“(?is)*(?*(?)|(?)|(?:

7、(?!“);如果不做转义处理,那么动态获取的 id 如果为“abc(def”这种形式,程序运行过程中就会抛出异常了。2.3 .NET 正则中字符组的转义正则中字符组的转义在字符组中,元字符通常是不需要转义的,甚至于“”也是不需要转义的。string test = “the test string: . $ ( | ) * + ? /“;Regex reg = new Regex(“.$(|)*+?/“);MatchCollection mc = reg.Matches(test);foreach (Match m in mc)richTextBox2.Text += m.Value + “/n

8、“;/*-输出-.$(|)*+?/*/但是在正则书写时,字符组中的“”还是建议使用“/”对其转义的,正则本身就已经是非常抽象,可读性很低的了,如果在字符组中再掺杂进这样不经转义的“”,会使得可读性更差。而且在出现不正确的嵌套时,可能会导致正则编译异常,以下正则在编译时就会抛异常的。Regex reg = new Regex(“.$(|)*+?/“);然而,.NET 的字符组中,是支持集合减法的,在这种正常语法形式下,是允许字符组嵌套的。string test = “abcdefghijklmnopqrstuvwxyz“;Regex reg = new Regex(“a-z-aeiou+“);M

9、atchCollection mc = reg.Matches(test);foreach (Match m in mc)richTextBox2.Text += m.Value + “/n“;/*-输出-bcdfghjklmnpqrstvwxyz*/这种用法可读性很差,应用也很少见,即使有这种需求也可以通过其它方式实现,了解一下即可,不必深究。话题再回到转义上,字符组中必须转义的只有“/”,而“”和“”出现在字符组中时,也是建议一定做转义处理的。另外有两个字符“”和“-”,出现在字符组中特定位置时,如果要匹配其本身,也是需要转义的。“”出现在字符组开始位置,表示排除型字符组, “Char”也

10、就是匹配除字符组中包含的字符之外的任意一个字符,比如“0-9”表示除数字外的任意一个字符。所以在字符组中,要匹配“”字符本身,要么不放在字符组开始位置,要么用“/”进行转义。Regex reg1 = new Regex(“0-9“);Regex reg2 = new Regex(“/0-9“);这两种方式都表达匹配任意一个数字或普通字符“”。至于“-”在字符组中特殊性,举一个例子。string test = “$“;Regex reg = new Regex(“#-*%richTextBox2.Text = “匹配结果:“ + reg.IsMatch(test);/*-输出-匹配结果:True

11、*/正则表达式中明明没有“$”,为什么匹配结果会是“True”呢?支持用连字符“-”连接两个字符,来表示一个字符范围。需要注意的是, “-”前后的两个字符是有顺序的,在使用相同的编码时,后面的字符码位应大于或等于前面字符的码位。for (int i = #; i list = new List();list.Add(new Regex(“/n“);list.Add(new Regex(“/n“);list.Add(new Regex(“/n“);list.Add(new Regex(“/n“);foreach (Regex reg in list)richTextBox2.Text += “正

12、则表达式:“ + reg.ToString();MatchCollection mc = reg.Matches(test);foreach (Match m in mc)richTextBox2.Text += “ 匹配内容:“ + m.Value + “ 匹配起始位置:“ + m.Index + “ 匹配长度:“ + m.Length;richTextBox2.Text += “ 匹配总数:“ + reg.Matches(test).Count + “/n-/n“;/*-输出-正则表达式:匹配内容:匹配起始位置:10 匹配长度:1 匹配总数:1-正则表达式:/n 匹配内容:匹配起始位置:1

13、0 匹配长度:1 匹配总数:1-正则表达式:/n 匹配内容:匹配起始位置:10 匹配长度:1 匹配总数:1-正则表达式:/n 匹配总数:0-*/可以看到,前三种写法,输出的正则虽不同,但执行结果却是完全相同的,只有最后一种是没有匹配的。正则表达式一 Regex(“/n“),其实就是以普通字符串形式来声明正则的,与用 Regex(“a“)来匹配字符“a”是同样的道理,是不经过正则引擎转义的。正则表达式二 Regex(“/n“),是以正则表达式形式来声明正则的,正如正则中的“/”就等同于字符串中的“/”一样,正则中的“/n”就等同于字符串中的“/n”,是经过正则引擎转义的。正则表达式三 Regex

14、(“/n“),与正则表达式二等价,是字符串前加“”的写法。正则表达式四 Regex(“/n“),其实这个表示的是字符“/”后面跟一个字符“n”,是两个字符,这个在源字符串中自然是找不到匹配项的。这里需要特别注意的还是“/b”,不同的声明方式, “/b”的意义是不同的。string test = “one line. /n another line.“;List list = new List();list.Add(new Regex(“line/b“);list.Add(new Regex(“line/b“);list.Add(new Regex(“line/b“);list.Add(new

15、Regex(“line/b“);foreach (Regex reg in list)richTextBox2.Text += “正则表达式:“ + reg.ToString() + “/n“;MatchCollection mc = reg.Matches(test);foreach (Match m in mc)richTextBox2.Text += “匹配内容:“ + m.Value + “ 匹配起始位置:“ + m.Index + “ 匹配长度:“ + m.Length + “/n“;richTextBox2.Text += “匹配总数:“ + reg.Matches(test).Count + “/n-/n“;/*-输出-正则表达式:line_匹配总数:0-正则表达式:line/b

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号