当前位置:  编程技术>其它

正则基础之 神奇的转义

    来源: 互联网  发布时间:2014-10-17

    本文导语:  1 概述这或许会是一个让人迷惑,甚至感到混乱的话题,但也正因为如此,才有了讨论的必要。在正则中,一些具有特殊意义的字符,或是字符序列,被称作元字符,如“?”表示被修饰的子表达式匹配0次或1次,“(?i)”表示忽...

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 = "only a test";
但是在字符串前加了“@”后,“”会被识别为“”字符本身,这样就不能用“””对双引号进行转义了,需要用“”””对双引号进行转义。
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 test
    RichTextBox2.Text += "源字符串:" & s.PadRight(5, " "c) & "匹配结果:" & reg.IsMatch(s) & vbCrLf
Next
'--------输出--------
'源字符串:    匹配结果:True
'源字符串:\   匹配结果:False
'--------------------

2.2     .NET正则中需要转义的元字符
在MSDN中,以下字符作为正则中的元字符,在匹配其本身时,需要对其进行转义
. $ ^ { [ ( | ) * + ?
但实际应用中,还要根据实际情况来判断,以上字符可能不需要转义,也可能不止以上字符需要转义。
在正常的正则书写过程中,以上字符的转义通常都能被编写人员正常处理,但是在动态生成正则时,就需要格外的注意,否则变量中包含元字符时,动态生成的正则在编译时可能会抛异常。好在.NET中提供了Regex.Escape方法来处理这一问题。比如根据动态获取的id来提取相应的div标签内容。
string id = Regex.Escape(textBox1.Text);
Regex reg = new Regex(@"(?is)

    
 
 

您可能感兴趣的文章:

  • php正则表达式转义字符的例子
  • c#转义字符串中的所有正则特殊字符方法示例
  • PHP正则表达式基本函数 修饰符 元字符和需转义字符说明
  • 网络技术 iis7站长之家
  • jQuery中的正则表达式分析 正则基础
  • java 正则表达式基础,实例学习资料收集大全 原创
  • 学习正则!超基础简单例子
  • 学php正则!超基础简单例子
  • javascript正则表达式基础篇
  • javascript之正则表达式基础知识小结
  • JavaScript 实现基础 正则表达式
  • 正则基础之 小数点
  • 正则基础之 b 单词边界
  • PHP 正则的使用基础入门
  • 正则表达式基础教程 regular expression第1/2页
  • 正则基础之 NFA引擎匹配原理
  • 正则基础之 环视 Lookaround
  • 正则表达式基础教程与说明
  • 正则表达式基础
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Perl 正则表达式之角色化记忆
  • 正则表达式 表示 非指定字符串开头的正则
  • Linux c++ boost库正则表达式用法
  • c#正则过滤图片标签 asp.net正则过滤的例子
  • Python通过正则表达式获取,去除(过滤)或者替换HTML标签的几种方法
  • 正则匹配后面非指定字符的正则 原创
  • linux bash shell命令:文本搜索工具grep正则表达式元字符集(基本集)
  • java使用正则表达校验手机号码示例(手机号码正则)
  • JS 正则表达式的相关方法(正则学习笔记1)
  • js正则表达式之RegExp对象之compile方法 编译正则表达式
  • PHP html标签正则替换并可自定义正则规则
  • 正则表达式问题,使用正则表达式找出指定字符串并替换?
  • 正则表达式概述 什么是正则表达式 .
  • php 正则 不包含某字符串的正则表达式
  • 常用正则表达式及评注-学习正则必备
  • python正则表达式去掉数字中的逗号(python正则匹配逗号)
  • 正则表达式口诀_学习正则的朋友值得一看
  • Javascript里的两种使用正则的方法
  • (菜鸟飞飞)问个正则表达式的问题
  • 哪些命令可以使用正则表达式
  • 向大家推荐一个收集整理正则表达式的网站


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3