摘要: 初学正则时,对于Regex类不熟悉,遇到问题不知道该用哪种方法解决,本文结合一些正则应用的典型应用场景,介绍一下Regex类的基本应用。这里重点进行.NET类的介绍,对于正则的运用,不做深入探讨。 正则的应用最终都是进行模式的匹配,而根据目的的不同,基本上可以分为以下几种应用:验证、提取、替换、分割。结合.NET提供的控件、类以及类的方法,可以很方便的实现这些应用。 阅读全文
posted @ 2011-12-31 15:49 pmars 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 捕获组(Expression)在匹配成功时,会将子表达式匹配到的内容,保存到内存中一个以数字编号的组里,可以简单的认为是对一个局部变量进行了赋值,这时就可以通过反向引用方式,引用这个局部变量的值。一个捕获组(Expression)在匹配成功之前,它的内容可以是不确定的,一旦匹配成功,它的内容就确定了,反向引用的内容也就是确定的了。 反向引用必然要与捕获组一同使用的,如果没有捕获组,而使用了反向引用的语法,不同语言的处理方式不一致,有的语言会抛异常,有的语言会当作普通的转义处理。 阅读全文
posted @ 2011-12-31 15:44 pmars 阅读(1824) 评论(0) 推荐(0) 编辑
摘要: 接触正则表达式不久的人,通常都会对非捕获比较迷惑,为什么要有非捕获组?作用是什么?应该在什么场景下使用? 说到非捕获组,首先要了解什么是捕获组,详细内容参考 正则基础之——捕获组(capture group)。 阅读全文
posted @ 2011-12-31 13:03 pmars 阅读(330) 评论(0) 推荐(0) 编辑
摘要: 平衡组是微软在.NET中提出的一个概念,主要是结合几种正则语法规则,提供对配对出现的嵌套结构的匹配。.NET是目前对正则支持最完备、功能最强大的语言平台之一,而平衡组正是其强大功能的外在表现,也是比较实用的文本处理功能,目前只有.NET支持,相信后续其它语言会提供支持。 平衡组可以有狭义和广义两种定义,狭义平衡组指.NET中定义的(?Expression)语法,广义平衡组并不是固定的语法规则,而是几种语法规则的综合运用,我们平时所说的平衡组通常指的是广义平衡组。本文中如无特殊说明,平衡组这种简写指的是广义平衡组。 正是由于平衡组功能的强大,所以带来了一些神秘色彩,其实平衡组并不难掌握。下面就平衡组的匹配原理、应用场景以及性能调优展开讨论。 阅读全文
posted @ 2011-12-31 12:42 pmars 阅读(621) 评论(0) 推荐(0) 编辑
摘要: .NET中的全局匹配模式是通过RegexOptions 枚举值指定的,可以按位“或”进行组合,全局匹配模式只能作用于整个正则表达式。全局匹配模式提供的模式更多,可以灵活的动态指定匹配模式。 而内联匹配模式是通过在正则表达式中,使用(?imnsx-imnsx:)或(?imnsx-imnsx)的分组构造来改变正则表达式的匹配行为的。内联匹配模式更灵活、简洁,但是提供的模式较少。 阅读全文
posted @ 2011-12-31 12:39 pmars 阅读(612) 评论(0) 推荐(0) 编辑
摘要: 日期正则一般是对格式有要求,且数据不是直接由用户输入时使用。因应用场景的不同,写出的正则也不同,复杂程度也自然不同。正则的书写需要根据具体情况具体分析,一个基本原则就是:只写合适的,不写复杂的。 阅读全文
posted @ 2011-12-31 12:35 pmars 阅读(606) 评论(0) 推荐(0) 编辑
摘要: “\b”匹配单词边界,不匹配任何字符。 “\b”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“\b”是零宽度的。 基本上所有的资料里都会说“\b”是单词边界,但是关于“单词”的范围却是少有提及。通常情况下,正则表达式中所谓的“单词”,就是由“\w”所定义的字符所组成的子串。 阅读全文
posted @ 2011-12-31 12:33 pmars 阅读(494) 评论(0) 推荐(0) 编辑
摘要: 环视只进行子表达式的匹配,不占有字符,匹配到的内容不保存到最终的匹配结果,是零宽度的。环视匹配的最终结果就是一个位置。 环视的作用相当于对所在位置加了一个附加条件,只有满足这个条件,环视子表达式才能匹配成功。 环视按照方向划分有顺序和逆序两种,按照是否匹配有肯定和否定两种,组合起来就有四种环视。顺序环视相当于在当前位置右侧附加一个条件,而逆序环视相当于在当前位置左侧附加一个条件。 阅读全文
posted @ 2011-12-31 12:27 pmars 阅读(561) 评论(0) 推荐(0) 编辑
摘要: 作为正则的使用者也一样,不懂正则引擎原理的情况下,同样可以写出满足需求的正则,但是不知道原理,却很难写出高效且没有隐患的正则。所以对于经常使用正则,或是有兴趣深入学习正则的人,还是有必要了解一下正则引擎的匹配原理的。 阅读全文
posted @ 2011-12-31 12:24 pmars 阅读(597) 评论(0) 推荐(1) 编辑
摘要: 对于使用传统NFA引擎的大多数语言,如Java,.NET来说,“.”的匹配范围是这样的。 但是对于JavaScript来说有些特殊,由于各浏览器的解析引擎不同,“.”的匹配范围也有所不同,对于Trident内核的浏览器,如IE来说,“.”同样是匹配除了换行符“\n”以外的任意一个字符,但是对于其它内核的浏览器,如Firefox、Opera、Chrome来说,“.”是匹配除了回车符“\r”和换行符“\n”以外的任意一个字符。 阅读全文
posted @ 2011-12-31 12:08 pmars 阅读(343) 评论(0) 推荐(0) 编辑
摘要: 普通捕获组在大多数支持正则表达式的语言或工具中都是支持的,而命名捕获组目前只有.NET、PHP、Python等部分语言支持,据说Java会在7.0中提供对这一特性的支持。上面给出的命名捕获组的语法是.NET中的语法,另外在.NET中使用(?’name’Expression)与使用(?Expression)是等价的。在PHP和Python中命名捕获组语法为:(?PExpression)。 另外需要说明的一点是,除(Expression)和(?Expression)语法外,其它的(?...)语法都不是捕获组。 阅读全文
posted @ 2011-12-30 14:53 pmars 阅读(13909) 评论(0) 推荐(2) 编辑
摘要: .NET的字符组中支持集合减法,语法[set1-[set2]],例如[a-z-[aeiou]]表示除元音外的小写字母。但是除非你很了解这种语法的支持范围,以及确实有必要这样做,否则不要轻易使用这种可读性较差的语法。事实上完全可以用多个范围区间[b-df-hj-np-tv-z],在区间较多,导致可读性差、容易出错的情况下,可以使用正向预搜索来实现以上需求,(?![aeiou])[a-z],这种语法规则,支持范围要大得多,可读性也要好一些。 阅读全文
posted @ 2011-12-30 12:49 pmars 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难。当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理,以后你还需要多练习,多使用,才能熟练掌握正则表达式。 阅读全文
posted @ 2011-12-29 18:08 pmars 阅读(1370) 评论(0) 推荐(1) 编辑
摘要: 最近做项目遇到了这个问题,在网上找了一下解决方法,发现这篇文章也是转载的,不过,他没有标出原出处,我在网上查找了一会,没有找到更多的,或者找到的都是别这个还要晚的文章,那么我标明的出处就算这个吧http://blog.csdn.net/wuhongyao3/article/details/5834921 阅读全文
posted @ 2011-12-27 16:41 pmars 阅读(9987) 评论(3) 推荐(3) 编辑
摘要: 在下载Html页面的时候,我们需要得到它的String,就必须得到它的Encoding,得到Encoding的方法很简单,在这里写下自己用到的code,做一下笔记。 代码其实都很简单,里面还有些简单的注释,很容易理解! 阅读全文
posted @ 2011-12-26 16:38 pmars 阅读(618) 评论(0) 推荐(1) 编辑