随笔分类 - 正则
正则匹配之——引擎匹配原理
摘要:1 为什么要了解引擎匹配原理一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动听的乐曲,但他/她或许不知道该如何去改变音符的组合,使得乐曲更动听。作为正则的使用者也一样,不懂正则引擎原理的情况下,同样可以写出满足需求的正则,但是不知道原理,却很难写出高效且没有隐患的正则。所以对于经常使用正则,或是有兴趣深入学习正则的人,还是有必要了解一下正则引擎的匹配原理的。2 正则表达式引擎正则引擎大体上可分为不同的两类:DFA和NFA,而NFA又基本上可以分为传统型NFA和POSIX NFA。DFADeterminis
阅读全文
正则表达式学习参考
摘要:正则表达式学习参考1 概述正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征。正如自然语言中“高大”、“坚固”等词语抽象出来描述事物特征一样,正则表达式就是字符的高度抽象,用来描述字符串的特征。正则表达式(以下简称正则,Regex)通常不独立存在,各种编程语言和工具作为宿主语言提供对正则的支持,并根据自身语言的特点,进行一定的剪裁或扩展。正则入门很容易,有限的语法规则很容易掌握,但是目前正则的普及率并不高,主要是因为正则的流派众多,各种宿主语言提供的文档都过多的关注于自身的一些细节,而这些细节通常是初学者并不需要关注的。当然,如果想要深入的了解正则表达式,
阅读全文
正则表达式/i,/g,/ig,/gi,/m
摘要:正则表达式中/i,/g,/ig,/gi,/m的区别和含义/i (忽略大小写)/g (全文查找出现的所有匹配字符)/m (多行查找)/gi(全文查找、忽略大小写)/ig(全文查找、忽略大小写)这些是模式修正符 -- 解说正则表达式模式中使用的修正符i如果设定此修正符,模式中的字符将同时匹配大小写字母。m当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。s如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。x如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未
阅读全文
正则应用之——日期正则表达式
摘要:1 概述首先需要说明的一点,无论是Winform,还是Webform,都有很成熟的日历控件,无论从易用性还是可扩展性上看,日期的选择和校验还是用日历控件来实现比较好。前几天在CSDN多个版块看到需要日期正则的帖子,所以整理了这篇文章,和大家一起讨论交流,如有遗漏或错误的地方,还请大家指正。日期正则一般是对格式有要求,且数据不是直接由用户输入时使用。因应用场景的不同,写出的正则也不同,复杂程度也自然不同。正则的书写需要根据具体情况具体分析,一个基本原则就是:只写合适的,不写复杂的。对于日期提取,只要能与非日期区分开,写最简单的正则即可,如\d{4}-\d{2}-\d{2}如果可以在源字符串中唯一
阅读全文
正则基础之——\b 单词边界
摘要:1 概述“\b”匹配单词边界,不匹配任何字符。“\b”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“\b”是零宽度的。基本上所有的资料里都会说“\b”是单词边界,但是关于“单词”的范围却是少有提及。通常情况下,正则表达式中所谓的“单词”,就是由“\w”所定义的字符所组成的子串。“\b”表示所在位置的一侧为单词字符,另一侧为非单词字符、字符串的开始或结束位置,也就相当于(?<!\w)(?=\w)|(?<=\w)(?!\w)思考:以下写法为什么不等价于“\b”(?<=\W)(?=\w)|(?<=\w)(?=\W)2 \w的
阅读全文
.NET 正则匹配之——.NET正则匹配模式
摘要:1 概述匹配模式指的是一些可以改变正则表达式匹配行为的选项或修饰符。不同的语言支持的匹配模式不同,使用的方式也不同。一般可分为全局和内联两种。下面主要介绍.NET中的匹配模式,其它语言的匹配模式,后续视情况补充。2 匹配模式2.1 全局匹配模式和内联匹配模式概述.NET中的全局匹配模式是通过RegexOptions 枚举值指定的,可以按位“或”进行组合,全局匹配模式只能作用于整个正则表达式。全局匹配模式提供的模式更多,可以灵活的动态指定匹配模式。而内联匹配模式是通过在正则表达式中,使用(?imnsx-imnsx:)或(?imnsx-imnsx)的分组构造来改变正则表达式的匹配行为的。内联匹配模
阅读全文
.NET正则基础之——平衡组
摘要:1 概述平衡组是微软在.NET中提出的一个概念,主要是结合几种正则语法规则,提供对配对出现的嵌套结构的匹配。.NET是目前对正则支持最完备、功能最强大的语言平台之一,而平衡组正是其强大功能的外在表现,也是比较实用的文本处理功能,目前只有.NET支持,相信后续其它语言会提供支持。平衡组可以有狭义和广义两种定义,狭义平衡组指.NET中定义的(?<Close-Open>Expression)语法,广义平衡组并不是固定的语法规则,而是几种语法规则的综合运用,我们平时所说的平衡组通常指的是广义平衡组。本文中如无特殊说明,平衡组这种简写指的是广义平衡组。正是由于平衡组功能的强大,所以带来了一些
阅读全文
正则基础之——非捕获组
摘要:非捕获组:(?:Expression)接触正则表达式不久的人,通常都会对非捕获比较迷惑,为什么要有非捕获组?作用是什么?应该在什么场景下使用?说到非捕获组,首先要了解什么是捕获组,详细内容参考 正则基础之——捕获组(capture group)。1、为什么要有非捕获组一旦使用了“()”,就会默认为是普通捕获组,从而将“()”内表达式匹配的内容捕获到组里。但是有些情况下,不得不用“()”,但并不关心“()”中匹配的内容是什么,后面也不会引用捕获到的内容,这带来了一个副作用,记录这些捕获组就会占用内存,降低匹配效率。设计非捕获组的目的就是为了抵消这种副作用。只进行分组,并不将子表达式匹配到的内容捕
阅读全文
.NET正则基础——.NET正则类及方法应用
摘要:1 概述初学正则时,对于Regex类不熟悉,遇到问题不知道该用哪种方法解决,本文结合一些正则应用的典型应用场景,介绍一下Regex类的基本应用。这里重点进行.NET类的介绍,对于正则的运用,不做深入探讨。正则的应用最终都是进行模式的匹配,而根据目的的不同,基本上可以分为以下几种应用:验证、提取、替换、分割。结合.NET提供的控件、类以及类的方法,可以很方便的实现这些应用。以下将结合一些典型的应用场景,对.NET中常见的类、方法及属性进行介绍。本文旨在.NET类基础用法的引导,对于其中涉及到的正则表达式不做深入探讨。本文适合于在.NET平台下使用正则的初学者。2 基础应用2.1 验证验证的目的是
阅读全文
正则基础之——反向引用
摘要:1 概述捕获组捕获到的内容,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用。要了解反向引用,首先要了解捕获组,关于捕获组,参考 正则基础之——捕获组(capture group)。反向引用的作用通常是用来查找或限定重复、查找或限定指定标识配对出现等等。对于普通捕获组和命名捕获组的引用,语法如下:普通捕获组反向引用:\k<number>,通常简写为\number命名捕获组反向引用:\k<name>或者\k'name'普通捕获组反向引用中number是十进制的数字,即捕获组的编号;命名捕获组反向引用中的na
阅读全文
.NET正则基础之——正则委托
摘要:1 概述一般的正则替换,只能对匹配的子串做简单的处理,且只能是做string类型的处理之后,作为替换文本替换匹配子串,可以实现的功能比较有限。.NET的Replace()方法中的replacement参数,不仅可以是字符串,还可以是委托(delegate),在每次匹配成功时,都会调用委托方法,对匹配的子串进行处理之后,再作为替换文本返回,匹配子串使用委托方法,可以做任意复杂的处理,因此这种替换功能非常强大。委托的类型可以是MatchEvaluator,也可以是匿名方法,在每次匹配成功时调用。委托方法传入参数是Match对象,返回类型是string,即正则表达式在每次匹配成功时,会得到一个Mat
阅读全文
正则基础之——贪婪与非贪婪模式
摘要:1 概述贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。属于贪婪模式的量词,也叫做匹配优先量词,包括:“{m,n}”、“{m,}”、“?”、“*”和“+”。在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括:“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。从正则语法的角度来讲,被匹配优先量词修饰的子表达式使用的就是贪婪模式,如“(Expression)+”;被忽略优
阅读全文
正则应用之——逆序环视探索
摘要:1 问题引出前几天在CSDN论坛遇到这样一个问题。我要通过正则分别取出下面 <font color="#008000"> 与 </font> 之间的字符串1、在 <font color="#008000"> 与 </font> 之间的字符串是没法固定的,是随机自动生成的2、其中 <font color="#008000"> 与 </font>的数量也是没法固定的,也是随机自动生成的<font color="#008000"> **
阅读全文
正则基础之——神奇的转义
摘要:1 概述这或许会是一个让人迷惑,甚至感到混乱的话题,但也正因为如此,才有了讨论的必要。在正则中,一些具有特殊意义的字符,或是字符序列,被称作元字符,如“?”表示被修饰的子表达式匹配0次或1次,“(?i)”表示忽略大小写的匹配模式等等。而当这些元字符被要求匹配其本身时,就要进行转义处理了。不同的语言或应用场景下,正则定义方式、元字符出现的位置不同,转义的方式也是林林总总,不一而同。2 .NET正则中的字符转义2.1 .NET正则中的转义符绝大多数语言中,“\”都被作为转义符,用来转义一些具有特殊意义的字符或字符序列,比如“\n”表示换行,“\t”表示水平制表符等。而这样的转义,应用到正则中,又会
阅读全文
正则匹配原理之——逆序环视深入
摘要:var str="8912341253789";需要将这个字符串中的重复的数字给去掉,也就是结果89123457。首先需要说明的是,这种需求并不适合用正则来实现,至少,正则不是最好的实现方式。这个问题本身不是本文讨论的重点,本文所要讨论的,主要是由这一问题的解决方案而引出的另一个正则匹配原理问题。先看一下针对这一问题本身给出的解决方案。string str = "8912341253789";Regex reg = new Regex(@"((\d)\d*?)\2");while (str != (str = reg.Replace(
阅读全文
常用正则表达式
摘要:"^\d+$" //非负整数(正整数 + 0)"^[0-9]*[1-9][0-9]*$" //正整数"^((-\d+)|(0+))$" //非正整数(负整数 + 0)"^-[0-9]*[1-9][0-9]*$" //负整数"^-?\d+$" //整数"^\d+(\.\d+)?$" //非负浮点数(正浮点数 + 0)"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*
阅读全文
浙公网安备 33010602011771号