摘要: 正则入门很容易,有限的语法规则很容易掌握,但是目前正则的普及率并不高,主要是因为正则的流派众多,各种宿主语言提供的文档都过多的关注于自身的一些细节,而这些细节通常是初学者并不需要关注的。 当然,如果想要深入的了解正则表达式,这些细节又是必须被关注的,这是后话,让我们先从正则的基础开始,进入正则表达式的世界。 阅读全文
posted @ 2011-12-31 16:03 pmars 阅读(480) 评论(0) 推荐(0) 编辑
摘要: 在正则中,一些具有特殊意义的字符,或是字符序列,被称作元字符,如“?”表示被修饰的子表达式匹配0次或1次,“(?i)”表示忽略大小写的匹配模式等等。而当这些元字符被要求匹配其本身时,就要进行转义处理了。 不同的语言或应用场景下,正则定义方式、元字符出现的位置不同,转义的方式也是林林总总,不一而同。 阅读全文
posted @ 2011-12-31 16:02 pmars 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 1、 逆序环视中子表达式为固定长度时,要么匹配成功,要么匹配失败,没什么好说的。 2、 逆序环视中子表达式为非贪婪模式时,只要找到一个匹配成功项,即交出控制权,并丢弃所有可供回溯的状态。 3、 逆序环视中子表达式为贪婪模式时,只有找到最长匹配成功项时,才会即交出控制权,并丢弃所有可供回溯的状态。 阅读全文
posted @ 2011-12-31 16:01 pmars 阅读(480) 评论(0) 推荐(0) 编辑
摘要: 在正则应用中需要注意的几点: 1、 不要轻易在逆序环视中使用不定长度的量词,除非确实需要; 2、 在任何场景下,不只是逆序环视中,不要轻易使用量词修饰匹配范围非常大的子表达式,小数点“.”和“[\s\S]”之类的,使用时尤其要注意。 阅读全文
posted @ 2011-12-31 15:58 pmars 阅读(697) 评论(0) 推荐(0) 编辑
摘要: 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。 阅读全文
posted @ 2011-12-31 15:54 pmars 阅读(294) 评论(0) 推荐(0) 编辑
摘要: 一般的正则替换,只能对匹配的子串做简单的处理,且只能是做string类型的处理之后,作为替换文本替换匹配子串,可以实现的功能比较有限。.NET的Replace()方法中的replacement参数,不仅可以是字符串,还可以是委托(delegate),在每次匹配成功时,都会调用委托方法,对匹配的子串进行处理之后,再作为替换文本返回,匹配子串使用委托方法,可以做任意复杂的处理,因此这种替换功能非常强大。 阅读全文
posted @ 2011-12-31 15:51 pmars 阅读(568) 评论(0) 推荐(0) 编辑
摘要: 初学正则时,对于Regex类不熟悉,遇到问题不知道该用哪种方法解决,本文结合一些正则应用的典型应用场景,介绍一下Regex类的基本应用。这里重点进行.NET类的介绍,对于正则的运用,不做深入探讨。 正则的应用最终都是进行模式的匹配,而根据目的的不同,基本上可以分为以下几种应用:验证、提取、替换、分割。结合.NET提供的控件、类以及类的方法,可以很方便的实现这些应用。 阅读全文
posted @ 2011-12-31 15:49 pmars 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 捕获组(Expression)在匹配成功时,会将子表达式匹配到的内容,保存到内存中一个以数字编号的组里,可以简单的认为是对一个局部变量进行了赋值,这时就可以通过反向引用方式,引用这个局部变量的值。一个捕获组(Expression)在匹配成功之前,它的内容可以是不确定的,一旦匹配成功,它的内容就确定了,反向引用的内容也就是确定的了。 反向引用必然要与捕获组一同使用的,如果没有捕获组,而使用了反向引用的语法,不同语言的处理方式不一致,有的语言会抛异常,有的语言会当作普通的转义处理。 阅读全文
posted @ 2011-12-31 15:44 pmars 阅读(1823) 评论(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 阅读(619) 评论(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 阅读(601) 评论(0) 推荐(0) 编辑
摘要: “\b”匹配单词边界,不匹配任何字符。 “\b”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“\b”是零宽度的。 基本上所有的资料里都会说“\b”是单词边界,但是关于“单词”的范围却是少有提及。通常情况下,正则表达式中所谓的“单词”,就是由“\w”所定义的字符所组成的子串。 阅读全文
posted @ 2011-12-31 12:33 pmars 阅读(494) 评论(0) 推荐(0) 编辑
摘要: 环视只进行子表达式的匹配,不占有字符,匹配到的内容不保存到最终的匹配结果,是零宽度的。环视匹配的最终结果就是一个位置。 环视的作用相当于对所在位置加了一个附加条件,只有满足这个条件,环视子表达式才能匹配成功。 环视按照方向划分有顺序和逆序两种,按照是否匹配有肯定和否定两种,组合起来就有四种环视。顺序环视相当于在当前位置右侧附加一个条件,而逆序环视相当于在当前位置左侧附加一个条件。 阅读全文
posted @ 2011-12-31 12:27 pmars 阅读(560) 评论(0) 推荐(0) 编辑
摘要: 作为正则的使用者也一样,不懂正则引擎原理的情况下,同样可以写出满足需求的正则,但是不知道原理,却很难写出高效且没有隐患的正则。所以对于经常使用正则,或是有兴趣深入学习正则的人,还是有必要了解一下正则引擎的匹配原理的。 阅读全文
posted @ 2011-12-31 12:24 pmars 阅读(593) 评论(0) 推荐(1) 编辑
摘要: 对于使用传统NFA引擎的大多数语言,如Java,.NET来说,“.”的匹配范围是这样的。 但是对于JavaScript来说有些特殊,由于各浏览器的解析引擎不同,“.”的匹配范围也有所不同,对于Trident内核的浏览器,如IE来说,“.”同样是匹配除了换行符“\n”以外的任意一个字符,但是对于其它内核的浏览器,如Firefox、Opera、Chrome来说,“.”是匹配除了回车符“\r”和换行符“\n”以外的任意一个字符。 阅读全文
posted @ 2011-12-31 12:08 pmars 阅读(343) 评论(0) 推荐(0) 编辑