- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
.NET正则中的字符转义
.NET正则中的字符转义
1????????概述
这或许会是一个让人迷惑,甚至感到混乱的话题,但也正因为如此,才有了讨论的必要。
在正则中,一些具有特殊意义的字符,或是字符序列,被称作元字符,如“?”表示被修饰的子表达式匹配0次或1次,“(?i)”表示忽略大小写的匹配模式等等。而当这些元字符被要求匹配其本身时,就要进行转义处理了。
不同的语言或应用场景下,正则定义方式、元字符出现的位置不同,转义的方式也是林林总总,不一而同。
2????????.NET正则中的字符转义
2.1?????.NET正则中的转义符
绝大多数语言中,“/”都被作为转义符,用来转义一些具有特殊意义的字符或字符序列,比如“/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
*/
对于这个结果,或许有人会感到迷惑,字符串中的“//”不是代表一个经过转义的“/”字符吗?而“////”不就应该代表两个经过转义的“/”字符吗?那么上面正则匹配的结果应该是第一个为False,第二个为True才对啊?
对于这一问题,直接解释或许不太容易理解,还是换种方式来解释吧。
比如要匹配的字符是这样的
string?test =?(;
那么正则如何写呢?因为“(”在正则中是有特殊意义的,所以写正则时必须对它进行转义,也就是“/(”,而在字符串中,要使用“//”?来表示“/”本身,也就是
Regex?reg =?new?Regex(^//($);
这个如果理解了,那再把“(”换回“/”,同样道理,在字符串中,要使用“//”?来表示“/”本身,也就是
Regex?reg =?new?Regex(^////$);
通过这样的分析,可以看出,其实在以字符串形式声明的正则中,“////”匹配的实际上就是单独的一个“/”字符。总结一下它们之间的关系:
输出到控制台或界面的字符串:/
程序中声明的字符串:string?test =?//;
程序中声明的正则:Regex?reg =?new?Regex(^////$);
这样解释是不是已经可以理解了,那么是不是感觉这样很笨拙?是的,在程序中以字符串形式声明的正则,涉及到转义符时就是这样笨拙的。
所以在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
*/
这样就简洁多了,也符合通常的理解。
但同时也带来另一个问题,就是双引号的转义处理。在普通的字符串声明中,可以用“/””对双引号进行转义。
string?test =?a href=//only a test/a;
但是在字符串前加了“@”后,“/”会被识别为“/”字符本身,这样就不能用“/””对双引号进行转义了,需要用“”””对双引号进行转义。
string?test =?@a href=only a test/a;
而在VB.NET中,正则的定义只有一种形式,与C#中加了“@”后的定义方式是一致的。
Dim?test?As?String() =?New?String() {/,?//}
Dim?reg?As?Regex =?New?Regex(^//$)
For?Each?s?As?String?In?test
????RichTextBox2.Text +=?源字符串:? s.PadRight(5,? c) ?匹配结果:? reg.IsMatch(s) vbCrLf
Next
--------输出--------
源字符串:/????匹配结果:True
源字符串://???匹配结果:False
--
您可能关注的文档
最近下载
- 股市主力操盘盘 口摩斯密码(原创内容,侵权必究).pptx
- 人教部编版小学四年级语文上册期末复习计划及全册单元复习课教案.docx VIP
- 幼儿园教师业务水平知识考试题(附答案).docx VIP
- 西北师范大学2022-2023学年第1学期《宏观经济学》期末考试试卷(A卷)附标准答案.docx
- 高三一轮复习生物【知识精研】免疫失调与免疫学的应用课件.pptx VIP
- 市政工程占道施工方案【可编辑】.doc
- 崩漏(功能失调性子宫出血)中医临床路径.pdf VIP
- 课件兽医法律法规.ppt
- 《人类简史》6分钟读完《人类简史》全部精华.docx VIP
- ipc6013中文版挠性印制板质量要求与性能规范汇编.doc
原创力文档


文档评论(0)