正则表达式笔记
- 格式:docx
- 大小:25.52 KB
- 文档页数:4
笔记整理——Linux下C语⾔正则表达式Linux下C语⾔正则表达式使⽤详解 - Google Chrome (2013/5/2 16:40:37)Linux下C语⾔正则表达式使⽤详解2012年6⽉6⽇627 views标准的C和C++都不⽀持正则表达式,但有⼀些函数库可以辅助C/C++程序员完成这⼀功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发⾏版本都带有这个函数库。
C语⾔处理正则表达式常⽤的函数有regcomp()、regexec()、regfree()和regerror(),⼀般分为三个步骤,如下所⽰:C语⾔中使⽤正则表达式⼀般分为三步:1. 编译正则表达式 regcomp()2. 匹配正则表达式 regexec()3. 释放正则表达式 regfree()下边是对三个函数的详细解释1. int regcomp (regex_t *compiled, const char *pattern, int cflags)这个函数把指定的正则表达式pattern编译成⼀种特定的数据格式compiled,这样可以使匹配更有效。
函数regexec 会使⽤这个数据在⽬标⽂本串中进⾏模式匹配。
执⾏成功返回0。
参数说明:①regex_t 是⼀个结构体数据类型,⽤来存放编译后的正则表达式,它的成员re_nsub ⽤来存储正则表达式中的⼦正则表达式的个数,⼦正则表达式就是⽤圆括号包起来的部分表达式。
②pattern 是指向我们写好的正则表达式的指针。
③cflags 有如下4个值或者是它们或运算(|)后的值:REG_EXTENDED 以功能更加强⼤的扩展正则表达式的⽅式进⾏匹配。
REG_ICASE 匹配字母时忽略⼤⼩写。
REG_NOSUB 不⽤存储匹配后的结果。
REG_NEWLINE 识别换⾏符,这样'$'就可以从⾏尾开始匹配,'^'就可以从⾏的开头开始匹配。
PowerShell笔记-13.正则表达式本系列是⼀个重新学习PowerShell的笔记,内容引⽤⾃定义模式如果你需要更加精确的模式识别需要使⽤正则表达式,正则表达式提供了更加丰富的通配符。
正因为如此,它可以更加详细的描述模式,正则表达式也因此稍显复杂。
使⽤下⾯的表格中列出的正则表达式元素,你可以⾮常精准的描述模式。
这些正则表达式元素可以归为三⼤类。
字符:字符可以代表⼀个单独的字符,或者⼀个字符集合构成的字符串。
限定符:允许你在模式中决定字符或者字符串出现的频率。
定位符:允许你决定模式是否是⼀个独⽴的单词,或者出现的位置必须在句⼦的开头还是结尾。
正则表达式代表的模式⼀般由四种不同类型的字符构成。
⽂字字符:像”abc”确切地匹配”abc“字符串转义字符:⼀些特殊的字符例如反斜杠,中括号,⼩括号在正则表达式中居于特殊的意义,所以如果要专门识别这些特殊字符需要转义字符反斜杠。
就像”[abc]”可以识别”[abc]”。
预定义字符:这类字符类似占位符可以识别某⼀类字符。
例如”\d”可以识别0-9的数字。
⾃定义通配符:包含在中括号中的通配符。
例如”[a-d]”识别a,b,c,d之间的任意字符,如果要排除这些字符,可以使⽤”[^a-d]”。
字符元素描述.匹配除了换⾏符意外的任意字符[^abc]匹配除了包含在中括号的任意字符[^a-z]匹配除了包含在中括号指定区间字符的任意字符[abc]匹配括号中指定的任意⼀个字符[a-z]匹配括号中指定的任意区间中的任意⼀个字符\a响铃字符(ASCII 7)\c or \C匹配ASCII 中的控制字符,例如Ctrl+C\d匹配数字字符,等同于[0-9]\D匹配数字以外的字符\e Esc (ASCII 9)\f换页符(ASCII 15)\n换⾏符\r回车符\s⽩空格(空格,制表符,新⾏)\S匹配⽩空格(空格,制表符,新⾏)意外的字符\t制表符\uFFFF匹配Unicode字符的⼗六进制代码FFFF。
JavaScript正则表达式迷你书之贪婪模式-学习笔记贪婪模式:在使⽤修饰匹配次数的特殊符号时,有⼏种表⽰⽅法可以使同⼀个表达式能够匹配不同的次数,⽐如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串⽽定。
这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配⾮贪婪模式:在修饰匹配次数的特殊符号后再加上⼀个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。
这种匹配原则叫作 "⾮贪婪" 模式,也叫作 "勉强" 模式。
如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,⾮贪婪模式会最⼩限度的再匹配⼀些,以使整个表达式匹配成功。
var regex = /\d{2,5}/g;var string = "123 1234 12345 123456";console.log( string.match(regex) );// => ["123", "1234", "12345", "12345"]其中正则 /d{2,5}/,表⽰数字连续出现 2 到 5 次。
会匹配 2 位、3 位、4 位、5 位连续数字。
但是其是贪婪的,它会尽可能多的匹配。
你能给我 6 个,我就要 5 个。
你能给我 3 个,我就要 3 个。
反正只要在能⼒范围内,越多越好。
横向模糊匹配横向模糊指的是,⼀个正则可匹配的字符串的长度不是固定的,可以是多种情况的。
其实现的⽅式是使⽤量词。
譬如 {m,n},表⽰连续出现最少 m 次,最多 n 次。
⽐如正则 /ab{2,5}c/ 表⽰匹配这样⼀个字符串:第⼀个字符是 "a",接下来是 2 到 5 个字符 "b",最后是字符 "c"。
(个人收集学习笔记)4字符串处理与正则表达式第四章字符串处理与正则表达式一、字符串处理介绍1、如果字符串处理函数和正则表达式都可以实现字符串操作,建议使用字符串处理函数,因为效率高。
2、因为PHP 是弱类型语言,所以其他类型的数据一般都可以直接应用于字符串操作函数里,而自动转换成字符串类型进行处理。
3、还可以将字符串视为数组,或当作字符集合来看待。
$str[0]$str{0}二、常用的字符串输出函数1、echo()函数:使用它的效率要比其他字符串输出函数高。
2、print()函数:功能和echo()一样,但它有返回值,成功返回1,不成功返回0。
3、die()函数:exit()函数的别名。
1)参数如果是字符串,则该函数会在退出前输出它。
2)如果参数是一个整数,这个值会被用做退出状态。
值在0-254之间,退出状态255由PHP 保留,不会使用。
状态0用于成功终止程序。
4、printf():用于输出格式化字符串。
1)例子:printf(“%s age is $d”,$str,$num);2)%d :带符号十进制数%u :无符号十进制数%f :浮点数%s :字符串%b :二进制数%c :依照ASCII 值的字符%%:返回百分比符号%o :八进制数%x :十六进制数(小写字母)%X :十六进制数(大写字母)3)如果%符号多于arg 参数,则必须使用占位符。
占位符被插入到%符号之后,由数字和\$组成。
如:printf(“The %2\$s book contains %1\$d pages.That’s a nice %2\$s full of %1\$d pages”,$num,$str);%2\$s 代表$str 。
5、sprintf()函数:用法和printf()一样,但它不是输出字符串,而是把格式化的字符串以返回值的形式写入到一个变量中。
三、常用的字符串格式化函数字符串的格式化就是将字符串处理为某种特定的格式。
ORACLE 正则表达式一.正则表达式简介:正则表达式,就是以某种模式来匹配一类字符串。
一旦概括了某类字符串,那么正则表达式即可用于针对字符串的各种相关操作。
例如,判断匹配性,进行字符串的重新组合等。
正则表达式提供了字符串处理的快捷方式。
Oracle 10g及以后的版本中也支持正则表达式.二. 正则表达式相对通配符的优势:1.正则表达式中不仅存在着代表模糊字符的特殊字符,而且存在着量词等修饰字符,使得模式的控制更加灵活和强大。
2.通配符的使用一般是在特定的环境下,不同的环境下,通配符有可能不同。
而正则表达式,不但广泛应用于各种编程语言,而且在各种编程语言中,保持了语法的高度一致性。
三. 元字符:元字符是指在正则表达式中表示特殊含义的字符。
量词用来指定量词的前一个字符出现的次数。
量词的形式主要有“?”、“*”、“+”、“{}”。
量词在用于匹配字符串时,默认遵循贪婪原则。
贪婪原则是指,尽可能多地匹配字符。
例如:字符串“Function(p),(OK)”,如果使用正则表达式“\(.*\)”进行匹配,则得到字符串“(p),(OK)” ,而非“(p)”;若欲得到“(p)”,则必须取消量词的贪婪原则,此时只需要为量词后追加另外一个数量词“?”即可。
如上面的正则表达式应该改为“\(.*?\)”。
五. 字符转义:元字符在正则表达式中有特殊含义。
如果需要使用其原义,则需要用到字符转义。
字符转义使用字符“\”来实现。
其语法模式为:“\”+元字符。
例如,“\.”表示普通字符“.”;“\.doc”匹配字符串“.doc”;而普通字符“\”需要使用“\\”来表示。
六. 字符组.字符组是指将模式中的某些部分作为一个整体。
这样,量词可以来修饰字符组,从而提高正则表达式的灵活性。
字符组通过()来实现.许多编程语言中,可以利用“$1”、“$2”等来获取第一个、第二个字符组,即所谓的后向引用。
在Oracle中,引用格式为“\1”、“\2”。
近段涉及到了数据的解析,自然离不开对Regular Expressions(正则表达式)的温习;在jdk 官方源码中看到了对《Mastering Regular Expressions, 2nd Edition》的推荐;由Jeffrey E.F. Friedl大师主刀,O'Reilly于2002年再版。
对O'Reilly的书向有好感,像当年误入java的歧途,没看Java编程思想之类的,倒看了O'Reilly的一本影印版《java in a nutshell》,颇留记忆。
正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。
Warren McCulloch 和Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。
1956 年, 一位叫Stephen Kleene 的数学家在McCulloch 和Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。
正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。
随后,发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是Unix 的主要发明人。
正则表达式的第一个实用应用程序就是Unix 中的qed 编辑器。
目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统;PHP,Perl,Python,C#,Java等开发环境,以及很多的应用软件中,For Example:网络上的搜索引擎,数据库的全文检索etc...本笔记是是自我学习过程的一个整理,例子或来源于书本,或自己枚举。
好了,废话一箩筐,切入正题。
1.正则表达式的介绍1.1、行开始和结束^begin line。
匹配行开头,如^cat匹配以cat开头的$end line。
正则表达式学习笔记(1)正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
列目录时,dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。
为便于理解和记忆,先从一些概念入手,所有特殊字符或字符组合有一个总表在后面,最后一些例子供理解相应的概念。
正则表达式是由普通字符(例如字符 a 到z)以及特殊字符(称为元字符)组成的文字模式。
正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式,即/expression/普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。
这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。
非打印字符特殊字符所谓特殊字符,就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。
如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。
ls \*.txt。
正则表达式有以下特殊字符。
构造正则表达式的方法和创建数学表达式的方法一样。
也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。
正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
限定符限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
有*或+或?或{n}或{n,}或{n,m}共6种。
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
正则表达式的限定符有:定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。
正则表达式记忆方法宝子!今天咱来唠唠正则表达式咋记。
正则表达式刚瞅的时候,就像一堆乱码似的,可吓人了。
咱先从那些基本的元字符开始哈。
像那个“.”,你就把它想成是个“小百搭”,它能匹配除了换行符之外的任何单个字符呢。
就好像是一个啥都能接的小助手,特别好记。
还有那个“*”,这就像是个贪心鬼。
它表示前面的字符可以出现零次或者多次。
你就想象它是个小馋猫,能把前面的字符吃好多好多遍,也可以一口都不吃。
比如说“a*”,那就是可以有好多好多的“a”,也可以一个“a”都没有。
“+”这个呢,和“*”有点像,但它至少得出现一次。
就好比是个有点小傲娇的家伙,必须得有,不能没有。
“a+”就是至少有一个“a”。
再来说说那些字符类。
“[]”里面放的就是一群字符,它表示匹配其中的任意一个字符。
你可以把它想象成是个小盒子,里面装着各种小宝贝,只要是盒子里的,都能被选中。
比如说“[abc]”,那就是“a”或者“b”或者“c”都能匹配到。
还有那个“^”,在方括号里面的时候,它就变成了“反着来”的意思。
比如说“[^abc]”,就是除了“a”“b”“c”之外的任何字符。
这就像一个叛逆的小娃娃,专门和里面的字符对着干。
要是说匹配数字呢,“\d”就很好记啦,你就想成是“digit(数字)”的缩写,它就是专门匹配数字的。
那要是想匹配非数字呢,“\D”就闪亮登场啦,它和“\d”就是相反的。
对于字母和数字的组合,“\w”就像是个小收纳盒,它能匹配字母、数字或者下划线。
你就想象它把这些都打包在一起了。
“\W”呢,自然就是和它相反的啦。
宝子,你看这么想的话,正则表达式是不是就没那么可怕啦?其实就把它当成是一群有个性的小卡通人物,每个都有自己独特的本事,记起来就容易多啦。
咱多玩几次,多试几次,慢慢就熟练掌握这个正则表达式的小世界啦。
要想学会正则表达式,理解元字符是一个必须攻克的难关。
不用刻意记.:匹配任何单个字符。
例如正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“bg”,但是不匹配“buug”,“b..g”可以匹配“buug”。
[ ] :匹配括号中的任何一个字符。
例如正则表达式“b[aui]g”匹配bug、big和bag,但是不匹配beg、baug。
可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[0-9]c”等价于“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母,“[A-Za-z0-9]”可以匹配任何的大小写字母或者数字。
( ) :将()之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。
把一些字符表示为一个整体。
改变优先级、定义提取组两个作用。
| :将两个匹配条件进行逻辑“或”运算。
'z|food'能匹配"z"或"food"。
'(z|f)ood'则匹配"zood"或"food"。
*:匹配0至多个在它之前的子表达式,和通配符*没关系。
例如正则表达式“zo*”能匹配“z”、“zo”以及“zoo”;因此“.*”意味着能够匹配任意字符串。
"z(b|c)*"→zb、zbc、zcb、zccc、zbbbccc。
"z(ab)*"能匹配z、zab、zabab(用括号改变优先级)。
+ :匹配前面的子表达式一次或多次,和*对比(0到多次)。
例如正则表达式9+匹配9、99、999等。
“zo+”能匹配“zo”以及“zoo”,不能匹配"z"。
Python学习笔记——正则表达式⼊门# 本⽂对正则知识不做详细解释,仅作⼊门级的正则知识⽬录。
正则表达式的强⼤早有⽿闻,⼤⼀时参加⼀次选拔考试,题⽬就是⽤做个HTML解析器,正则的优势表现得淋漓尽致。
题外话不多讲,直接上⼲货:1. 元字符: 与之对应的还有反义字符,⼤部分为⼩写字母变⼤写,例如\D表⽰匹配⾮数字的字符。
2. 重复(即匹配变长的字符串): 元字符可匹配单⼀的字符类型,若想匹配长度未知或长度限定的字符串需要在后边加上限定符。
3. 范围与分组: 有时元字符并不能满⾜匹配字符的需求,这时就需要[]来圈定匹配范围,例如要匹配⼀个只带有a,s,d,f的单词,可以⽤\b[asdf]\b;正则⾥⾯还有⼩括号⽤来表⽰分组,⽐如你想重复某⼏个字符,就可以使⽤分组,例如(\d.\d){1,3}表⽰匹配⼩括号⾥的重复内容⼀到三次。
此外,⼩括号还可以⽤来后向引⽤等,此处不记。
4. 零宽断⾔: 零宽断⾔主要⽤来查找在某些断⾔(指定内容)之前或之后的内容,例如(?=exp)匹配表达式exp前⾯出现的内容(不匹配exp),(?<=exp)匹配表达式exp后⾯出现的内容,还有负向零宽断⾔等此处不记。
5. 贪婪与懒惰: 当正则表达式中包含能接受重复的限定符时,通常的⾏为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,即贪婪匹配。
如表达式a.*b,搜索aabab的话,它会匹配整个字符串aabab。
⽽懒惰匹配会匹配尽可能少的字符串,只需要在限定符后⾯加⼀个?,例如a.*?b会匹配aab(第⼀到第三个字符)和ab(第四到第五个字符)。
6. Python的re模块: python 提供re模块,提供正则的所有功能。
下⾯只记两个⽅法和⼀个注意的地⽅。
6.1 match⽅法: match()⽅法判断是否匹配,如果匹配成功,返回⼀个Match对象,否则返回None。
1 >>> import re2 >>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')3 <_sre.SRE_Match object at 0x1026e18b8>4 >>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')5 >>> 如果正则表达式中定义了组,就可以在Match对象上⽤group()⽅法提取出⼦串来。