正则表达式
什么是正则表达式?

什么是正则表达式?
什么是正则表达式?
正则表达式也称模式表达式,其⾃⾝具有⼀套⾮常完整的、可以编写模式的语法体系,提供了⼀种灵活且直观的字符串处理⽅法。
正则表达式通过构建特定规则的模式,与输⼊的字符串信息⽐较,从⽽实现字符串的匹配、查找、替换及分割等操作。
正则表达式并不是PHP⾃⼰的产物,在很多领域都会见到它的应⽤,除了在perl、C#及Java语⾔中应⽤外,我们的B/S架构软件开发
中,Linux操作系统、前台JavaScript脚本、后台脚本PHP以及MySQL数据库中都可以应⽤到正则表达式。
正则表达式语法概述
正则表达式是⼀种描述字符串结构的语法规则,是⼀个特定的格式化模式,可以匹配、替换、截取匹配的字串。
对于⽤户来说,可能以前接触过DOS,如果相匹配当前⽂件夹下所有的⽂本⽂件,可以输⼊“dir *.txt”命令,按enter键后所有“.txt”⽂件都会被列出来。
这⾥的“*.txt”即可理解为⼀个简单的正则表达式。
PHP⽀持两种风格的正则表达式语法:POSIX和Perl。
这两种风格的正则表达式是PHP编译时的默认风格。
在PHP5.3版本中,Perl风格不能被禁⽤。
POSIX正则表达式更容易掌握,但是他们不是⼆进制安全的。
何时⽤到正则表达式?
到⽬前为⽌,我们进⾏的所有模式匹配都使⽤了字符串函数。
我们只限于进⾏精确匹配,或精确的⼦字符串匹配。
如果希望完成⼀些更负责的模式匹配,应该⽤正则表达式。
正则表达式在开始学习时很难掌握,但是却⾮常有⽤。
常用的正则表达式

常用的正则表达式整理1、非负整数:^\d+$2、正整数:^[0-9]*[1-9][0-9]*$3、非正整数:^((-\d+)|(0+))$4、负整数:^-[0-9]*[1-9][0-9]*$5、整数:^-?\d+$6、非负浮点数:^\d+(\.\d+)?$7、正浮点数:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)) $8、非正浮点数:^((-\d+\.\d+)?)|(0+(\.0+)?))$9、负浮点数:^(-((正浮点数正则式)))$10、英文字符串:^[A-Za-z]+$11、英文大写串:^[A-Z]+$12、英文小写串:^[a-z]+$13、英文字符数字串:^[A-Za-z0-9]+$14、英数字加下划线串:^\w+$15、E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$16、URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$17、邮政编码:^[1-9]\d{5}$18、中文:^[\u0391-\uFFE5]+$19、电话号码:^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$ 20、手机号码:^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$21、双字节字符(包括汉字在内):^\x00-\xff22、匹配首尾空格:(^\s*)|(\s*$)(像vbscript那样的trim函数)23、匹配HTML标记:<(.*)>.*<\/\1>|<(.*) \/>24、匹配空行:\n[\s| ]*\r25、提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?26、提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*27、提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?28、提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)29、提取信息中的中国手机号码:(86)*0*13\d{9}30、提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}31、提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}32、提取信息中的中国邮政编码:[1-9]{1}(\d+){5}33、提取信息中的浮点数(即小数):(-?\d*)\.?\d+34、提取信息中的任何数字:(-?\d*)(\.\d+)?35、IP:(\d+)\.(\d+)\.(\d+)\.(\d+)36、电话区号:/^0\d{2,3}$/37、腾讯QQ号:^[1-9]*[1-9][0-9]*$38、帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$匹配中文字符的正则表达式:[\u4e00-\u9fa5]匹配双字节字符(包括汉字在内):[^\x00-\xff]匹配空行的正则表达式:\n[\s| ]*\r匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 匹配首尾空格的正则表达式:(^\s*)|(\s*$)匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S *)?$匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})?匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$下表是元字符及其在正则表达式上下文中的行为的一个完整列表:\将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。
正则表达式 $用法

正则表达式 $用法
(原创版)
目录
1.正则表达式简介
2.$用法概述
3.$用法实例分析
4.$用法总结
正文
1.正则表达式简介
正则表达式(Regular Expression,简称 regex)是一种强大的文本处理工具,可以用来检查文本是否符合某种模式、提取文本中的特定信息等。
正则表达式广泛应用于计算机科学和编程领域,例如文本编辑器、搜索引擎、数据验证等场景。
2.$用法概述
在正则表达式中,$符号表示字符串的结尾。
$用法主要用于匹配字符串的最后一个字符或者表示字符串以某个字符结尾。
当需要在正则表达式中使用$时,需要在$符号前加上反斜杠()进行转义,以免被解释为特殊符号。
3.$用法实例分析
举例来说,如果我们想要匹配所有以字母 a 结尾的单词,可以使用以下正则表达式:
```
b[a-zA-Z]*[a-zA-Z]$b
```
这个正则表达式的意思是:
- `b`表示单词边界,用于匹配单词;
- `[a-zA-Z]`表示任意一个大写或小写字母;
- `*`表示前面的字符(字母)可以出现任意次;
- `[a-zA-Z]`表示最后一个字符必须是字母;
- `b`表示单词边界,用于匹配单词结尾。
这样,我们就可以匹配到所有以字母 a 结尾的单词,如"apple"、"banana"等。
4.$用法总结
$用法在正则表达式中起到了关键的作用,它可以帮助我们精确地匹配字符串的结尾。
在实际应用中,我们可以灵活运用$用法来处理各种文本问题。
正则表达式150种表达方式

正则表达式150种表达方式1、删除所有数字。
只要查找:\d就OK。
为了不留空行:替换处:\d2、删除所有英文字母。
只要查找:\a就OK。
为了不留空行:替换处:\d3、删除除换行符以外的所有。
只要查找:. 为了不留空行:替换处:\d4、既删除英文字母又删除数字。
只要查找:\w。
为了不留空行:替换处:\d5、删除数字加字母加等于(如:3a=或3zz=)只要查找:\d+\a+\=。
为了不留空行:替换处:\d6、删除换行。
只要查找:$。
替换处:\d(还原查找:\a+=\f。
替换:\0\n)。
如在换行后加一空格,查找:(\a)$。
替换:\0 \d。
7、删除空行只要查找:^$。
为了不留空行:替换处:\d8、删除首尾空格。
只要查找:^\s*|\s*$就OK9、删除行前数字及顿号。
只要查找:\d+、替换为空10、删除末尾标点符号。
只要查找:\P+$|\P+\s+$,“|”前面是没有空格的,“|”后面有空格,P后的加是为了……而用的。
11、删除末尾空格。
只要查找:\s+$。
替换为空。
12、删除第一个字如:“的我们”中的“的”只要查找:^\的。
13、删除第几个字。
查找:查找:^().(.+)。
替换:\1\2。
去掉前面的拼音:查找:^\a+替换为空。
第一个括号里可加“.”且可变。
14、删含的。
查:.*的.*替:\d。
的头查:.*=的.*替:\d。
的尾查:\a.*\c.*的$替:\d(留它不匹配)●删非的行查:^[^的]+$替:\d15、删除几码以上的码查:^(...)...替:\1。
删第几位码。
查:^(...).(.+)替:\1\2(变成\1,\2则其位则改成,了)首括号的.可变。
16、删除各类型的几字词,但必须是码前词后或纯词。
三字词:查找:^\~f{}\f{3}$替换:\d。
替换:\d “3”可以改。
17、删除11字词及其以上的词条查找(自定义格式):\a{}\=(\c|\P|\p){11,}。
替换:\d。
11可改。
正则表达式公式大全

正则表达式公式大全正则表达式是一种处理字符串的强大工具,它可以帮助我们快速、高效地匹配、替换、删除、提取字符串。
很多编程语言,包括Python、Java、JavaScript等都支持正则表达式,所以掌握正则表达式是非常重要的。
下面是一些常用的正则表达式公式:1. 匹配单个字符:(1).点号(.)表示匹配任何单个字符,除了换行符。
(2)\d表示数字,等价于[0-9]。
(3)\D表示非数字,等价于[^0-9]。
(4)\w表示字符,包括数字、字母和下划线,等价于[a-zA-Z0-9_]。
(5)\W表示非字符,等价于[^a-zA-Z0-9_]。
(6)\s表示空白字符,包括空格、制表符、换行符等。
(7)\S表示非空白字符。
2. 匹配重复字符:(1)*表示重复0次或更多次。
(2)+表示重复1次或更多次。
(3)?表示重复0次或1次。
(4){n}表示重复n次。
(5){n,}表示重复n次或更多次。
(6){n,m}表示重复n到m次。
3. 匹配位置:(1)^表示匹配开头位置。
(2)$表示匹配结尾位置。
(3)\b表示匹配单词边界。
(4)\B表示匹配非单词边界。
4. 匹配分组:(1)( )表示一个分组。
(2)\1、\2、\3等表示对之前的分组的引用。
(3)(?: )表示一个非捕获分组。
5. 匹配字符集:(1)[ ]表示一个字符集,例如[abc]表示匹配a、b、c中的任意一个字符。
(2)[^ ]表示一个否定字符集,例如[^abc]表示匹配除了a、b、c以外的任意一个字符。
(3)[a-z]表示一个范围,表示匹配a至z中的任意一个字母。
6. 匹配转义字符:(1)\表示转义字符,例如\\.表示匹配点号。
(2)\n表示匹配换行符。
(3)\r表示匹配回车符。
(4)\t表示匹配制表符。
(5)\xx表示匹配十六进制字符。
以上是一些常用的正则表达式公式,如果我们能够熟练掌握这些公式,就可以很好地应用正则表达式来处理字符串。
当然,对于不同编程语言来说,对于正则表达式的支持也会有所不同,所以需要我们在实际应用中注意区别。
常用正则式

61.
62. (?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
63.
64. (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
119.
120. 匹配双字节字符(包括汉字在内):[^x00-xff]
121.
122. 匹配空行的正则表达式:n[s| ]*r
123.
124. 匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/
125.
126. 匹配首尾空格的正则表达式:(^s*)|(s*$)
75.
76. [^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。
77.
78. \b 匹配一个单词边界,也就是指单词和空格间的位置。
79.
80. \B 匹配非单词边界。
81.
82. \cx 匹配由x指明的控制字符。
83.
36.
37. 元字符及其在正则表达式上下文中的行为:
38.
39. \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。
40.
41. ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。
91.
92. \r 匹配一个回车符。等价于 \x0d 和 \cM。
正则表达式
正则表达式(I)正则表达式是由英文词语regular expression翻译过来的,就是符合某种规则的表达式。
正则表达式在软件开发中应用非常广泛,例如,找出网页中的超链接,找出网页中的email 地址,找出网页中的手机号码,判断输入的内容是否全部是数字,是否满足某种日期格式等等。
可以将正则表达式理解为一种对文字进行模糊匹配的语言,它用一些特殊的符号(称为元字符)来代表具有某种特征的一组字符以及该组字符重复出现的次数。
例如,对于正则表达式“\d{5}(-\d{4})?”,\d就是一个元字符,它表示一个数字字,{5}表示紧靠它前面的元素项连续重复5次,\d和{5}的组合\d{5}就表示匹配任意连续的5个数字字符;-\d{4}匹配的是一个连字号(-)后加上4个任意的数字,(-\d{4})?表示连字号(-)和后面的4个数字可有可无。
对于整个正则表达式“\d{5}(-\d{4})?”,表示要么是5个连续的数字字符,要么是5个连续的数字后加上一个连字号(-)、再加上4个连续的数字组成的10个字符。
正则表达式中的圆括号除了能将多个元素组合成一个可统一操作的组合项外,它所括起来的表达式部分还成为了一个子匹配(也叫子表达式),也就是说,我们可以用圆括号在一个长的正则表达式中划分出子表达式。
这样,除了可以得到整个正则表达式的匹配结果外,还可以单独得到每个子表达式部分所匹配的结果。
要灵活运用正则表达式,必须了解其中各种元字符的功能。
元字符从功能上大致分为:限定符、选择匹配符、分组组合和反向引用符、特殊字符、字符匹配符、定位符。
限定符用于指定其前面的字符或组合项连续出现多少次,下面是各种限定符及其含义:●{n} 规定前面的元素或组合项的连续出现n 次●{n,} 规定前面的元素或组合项至少连续出现n 次●{n,m } 规定前面的元素或组合项至少连续出现n 次,至多连续出现m 次●+ 规定前面的元素或组合项必须出现一次或连续多次,等效于{1,}●* 规定前面的元素或组合项可以出现零次或连续多次,等效于{0,}●? 规定前面的元素或组合项出现零次或一次,等效于{0,1}默认情况下,正则表达式使用最长(也叫贪婪)匹配原则。
20个常用的正则表达式 单字母
正则表达式(Regular Expression)是一种用于匹配字符串的强大工具。
它通过使用特定的符号和字符来描述和匹配一系列字符串,能够满足我们在处理文本时的各种需求。
在这篇文章中,我们将深入探讨20个常用的单字母正则表达式,并通过实例来展示它们的使用方法。
1. \b在正则表达式中,\b表示单词的边界。
它可以用来匹配单词的开头或结尾,用于查找特定单词而不是单词的一部分。
2. \d\d表示任意一个数字字符。
它可以用来匹配任何数字,例如\d+可以匹配一个或多个数字字符。
3. \w\w表示任意一个字母、数字或下划线字符。
它可以用来匹配单词字符,例如\w+可以匹配一个或多个单词字符。
4. \s\s表示任意一个空白字符,包括空格、制表符、换行符等。
它可以用来匹配空白字符,例如\s+可以匹配一个或多个空白字符。
5. \.\.表示匹配任意一个字符,包括标点符号和空格等。
它可以用来匹配任意字符,例如\.可以匹配任意一个字符。
6. \A\A表示匹配字符串的开始。
它可以用来确保匹配发生在字符串的开头。
7. \Z\Z表示匹配字符串的结束。
它可以用来确保匹配发生在字符串的结尾。
8. \b\b表示单词的边界。
它可以用来匹配单词的开头或结尾,用于查找特定单词而不是单词的一部分。
9. \D\D表示任意一个非数字字符。
它可以用来匹配任何非数字字符。
10. \W\W表示任意一个非单词字符。
它可以用来匹配任何非单词字符。
11. \S\S表示任意一个非空白字符。
它可以用来匹配任何非空白字符。
12. \[\[表示匹配方括号。
它可以用来匹配包含在方括号内的字符。
13. \]\]表示匹配方括号。
它可以用来匹配包含在方括号内的字符。
14. \(\(表示匹配左括号。
它可以用来匹配包含在左括号内的字符。
15. \)\)表示匹配右括号。
它可以用来匹配包含在右括号内的字符。
16. \{\{表示匹配左花括号。
它可以用来匹配包含在左花括号内的字符。
17. \}\}表示匹配右花括号。
正则表达式实用语法大全
正则表达式基本符号:^ 表示匹配字符串的开始位置 (例外用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串)$ 表示匹配字符串的结束位置* 表示匹配零次到多次+ 表示匹配一次到多次 (至少有一次)表示匹配零次或一次. 表示匹配单个字符| 表示为或者,两项中取一项( ) 小括号表示匹配括号中全部字符[ ] 中括号表示匹配括号中一个字符范围描述如[0-9 a-z A-Z]{ } 大括号用于限定匹配次数如 {n}表示匹配n个字符 {n,}表示至少匹配n个字符{n,m}表示至少n,最多m\ 转义字符如上基本符号匹配都需要转义字符如 \* 表示匹配*号\w 表示英文字母和数字 \W 非字母和数字\d 表示数字 \D 非数字常用的正则表达式匹配中文字符的正则表达式: [\u4e00-\u9fa5]匹配双字节字符(包括汉字在内):[^\x00-\xff]匹配空行的正则表达式:\n[\s| ]*\r匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/匹配首尾空格的正则表达式:(^\s*)|(\s*$)匹配IP地址的正则表达式:/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*匹配网址URL的正则表达式:http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?sql语句:^(select|drop|delete|create|update|insert).*$1、非负整数:^\d+$2、正整数:^[0-9]*[1-9][0-9]*$3、非正整数:^((-\d+)|(0+))$4、负整数:^-[0-9]*[1-9][0-9]*$5、整数:^-?\d+$6、非负浮点数:^\d+(\.\d+)?$7、正浮点数:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$8、非正浮点数:^((-\d+\.\d+)?)|(0+(\.0+)?))$9、负浮点数:^(-((正浮点数正则式)))$10、英文字符串:^[A-Za-z]+$11、英文大写串:^[A-Z]+$12、英文小写串:^[a-z]+$13、英文字符数字串:^[A-Za-z0-9]+$14、英数字加下划线串:^\w+$15、E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$16、URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$ 或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$17、邮政编码:^[1-9]\d{5}$18、中文:^[\u0391-\uFFE5]+$19、电话号码:^((\d2,3)|(\d{3}\-))?(0\d2,3|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$20、手机号码:^((\d2,3)|(\d{3}\-))?13\d{9}$21、双字节字符(包括汉字在内):^\x00-\xff22、匹配首尾空格:(^\s*)|(\s*$)(像vbscript那样的trim函数)23、匹配HTML标记:<(.*)>.*<\/\1>|<(.*) \/>24、匹配空行:\n[\s| ]*\r25、提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *=*('|")?(\w|\\|\/|\.)+('|"| *|>)?26、提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*27、提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?28、提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)29、提取信息中的中国手机号码:(86)*0*13\d{9}30、提取信息中的中国固定电话号码:(\d3,4|\d{3,4}-|\s)?\d{8}31、提取信息中的中国电话号码(包括移动和固定电话):(\d3,4|\d{3,4}-|\s)?\d{7,14}32、提取信息中的中国邮政编码:[1-9]{1}(\d+){5}33、提取信息中的浮点数(即小数):(-?\d*)\.?\d+34、提取信息中的任意数字:(-?\d*)(\.\d+)?35、IP:(\d+)\.(\d+)\.(\d+)\.(\d+)36、电话区号:/^0\d{2,3}$/37、腾讯QQ号:^[1-9]*[1-9][0-9]*$38、帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$39、中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$。
pattern 正则表达式大全
正则表达式是一种强大的文本匹配和处理工具,它可以在文本中进行复杂的匹配和替换操作。
无论是在编程语言中还是在各种文本处理工具中,正则表达式都扮演着重要的角色。
本文将为您详细介绍正则表达式的相关知识,包括基本语法、元字符、量词、分组、反向引用、预搜索等内容,帮助您深入了解和掌握正则表达式的用法和技巧。
一、正则表达式基础知识1.1 正则表达式概述正则表达式是一种用来描述、匹配一系列符合某个句法规则的字符串的表达式。
通过使用正则表达式,我们可以轻松地在文本中查找、替换符合特定模式的字符串,实现文本的快速处理和处理。
1.2 基本语法正则表达式的基本语法包括普通字符和特殊字符。
普通字符就是匹配其自身的字符,比如字母、数字、标点符号等;特殊字符则具有特殊的含义,比如"."匹配任意一个字符,"^"匹配字符串的开头,"$"匹配字符串的结尾等。
1.3 元字符元字符是正则表达式中具有特殊含义的字符,比如"."、"^"、"$"等。
通过使用元字符,我们可以实现更精确的匹配和替换操作。
二、正则表达式进阶技巧2.1 量词正则表达式中的量词用来指定匹配字符的数量,比如"*"表示零个或多个,"+"表示一个或多个,"?"表示零个或一个等。
通过使用量词,我们可以对文本中特定模式的字符串进行更精确的匹配。
2.2 分组正则表达式中的分组用来将多个字符组合成一个整体进行匹配,比如"(abc)"表示匹配"abc"这个字符串。
通过使用分组,我们可以更灵活地进行匹配和替换操作。
2.3 反向引用正则表达式中的反向引用用来引用前面匹配到的分组,比如"\1"表示引用第一个分组所匹配到的内容。
通过使用反向引用,我们可以实现一些复杂的匹配和替换操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
概念一个正则表达式,就是用某种模式去匹配一类字符串的一个公式。
很多人因为它们看上去比较古怪而且复杂所以不敢去使用——很不幸,这篇文章也不能够改变这一点,不过,经过一点点练习之后我就开始觉得这些复杂的表达式其实写起来还是相当简单的,而且,一旦你弄懂它们,你就能把数小时辛苦而且易错的文本处理工作压缩在几分钟(甚至几秒钟)内完成。
正则表达式被各种文本编辑软件、类库(例如Rogue Wave的tools.h++)、脚本工具(像awk/grep/sed)广泛的支持,而且像Microsoft的Visual C++这种交互式IDE也开始支持它了。
我们将在如下的章节中利用一些例子来解释正则表达式的用法,绝大部分的例子是基于vi中的文本替换命令和grep文件搜索命令来书写的,不过它们都是比较典型的例子,其中的概念可以在sed、awk、perl和其他支持正则表达式的编程语言中使用。
你可以看看不同工具中的正则表达式这一节,其中有一些在别的工具中使用正则表达式的例子。
还有一个关于vi中文本替换命令(s)的简单说明附在文后供参考。
基础(摘自《正则表达式之道》)正则表达式由一些普通字符和一些元字符(metacharacters)组成。
普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,我们下面会给予解释。
在最简单的情况下,一个正则表达式看上去就是一个普通的查找串。
例如,正则表达式"testing"中没有包含任何元字符,它可以匹配"testing"和"123testing"等字符串,但是不能匹配"Testing"。
要想真正的用好正则表达式,正确的理解元字符是最重要的事情。
下表列出了所有的元字符和对它们的一个简短的描述。
元字符描述.点匹配任何单个字符。
例如正则表达式r.t匹配这些字符串:rat、rut、r t,但是不匹配root。
$ 匹配行结束符。
例如正则表达式weasel$ 能够匹配字符串"He's a weasel"的末尾但是不能匹配字符串"They are a bunch of weasels."^ 匹配一行的开始。
例如正则表达式^When in能够匹配字符串"When in the course of human events"的开始,但是不能匹配"What and When in the"* 匹配0或多个正好在它之前的那个字符。
例如正则表达式。
*意味着能够匹配任意数量的任何字符。
\ 这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配。
例如正则表达式\$被用来匹配美元符号,而不是行尾,类似的,正则表达式\.用来匹配点字符,而不是任何字符的通配符。
[ ] [c1-c2] [^c1-c2] 匹配括号中的任何一个 字符。
例如正则表达式r[aou]t 匹配rat 、rot和rut ,但是不匹配ret 。
可以在括号中使用连字符-来指定字符的区间,例如正则表达式 [0-9]可以匹配任何数字字符;还可以制定多个区间,例如正则表达式[A-Za-z]可以匹配任何大小写字母。
另一个重要的用法是“排除”,要想匹配除 了指定区间之外的字符——也就是所谓的补集——在左边的括号和第一个字符之间使用^字符,例如正则表达式[^269A-Z] 将匹配除了2、6、9和所有大写字母之外的任何字符。
\< \> 匹配词(word )的开始(\<)和结束(\>)。
例如正则表达式\<the\>能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。
注意:这个元字符不是所有的软件都支持的。
\( \) 将 \( 和 \) 之间的表达式定义为“组”(group ),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。
| 将两个匹配条件进行逻辑“或”(Or )运算。
例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。
注意:这个元字符不是所有的软件都支持的。
+ 匹配1或多个正好在它之前的那个字符。
例如正则表达式9+匹配9、99、999等。
注意:这个元字符不是所有的软件都支持的。
?匹配0或1个正好在它之前的那个字符。
注意:这个元字符不是所有的软件都支持的。
{i} {i,j} 匹配指定数目的字符,这些字 符是在它之前的表达式定义的。
例如正则表达式A[0-9]{3} 能够匹配字符"A"后面跟着正好3个数字字符的串,例如A123、A348等,但是不匹配A1234。
而正则表达式[0-9]{4,6} 匹配连续的任意4个、5个或者6个数字字符。
注意:这个元字符不是所有的软件都支持的。
最简单的元字符是点,它能够匹配任何单个字符(注意不包括换行符)。
假定有个文件test.txt 包含以下几行内容:he is a rathe is in a rutthe food is RottenI like root beer我们可以使用grep 命令来测试我们的正则表达式,grep 命令使用正则表达式去尝试匹配指定文件的每一行,并将至少有一处匹配表达式的所有行显示出来。
命令grep r.t test.txt在test.txt 文件中的每一行中搜索正则表达式r.t ,并打印输出匹配的行。
正则表达式 r.t 匹配一个r 接着任何一个字符再接着一个t 。
所以它将匹配文件中的rat 和rut ,而不能匹配Rotten 中的Rot ,因为正则表达式是大小写敏感 的。
要想同时匹配大写和小写字母,应该使用字符区间元字符(方括号)。
正则表达式[Rr]能够同时匹配R 和r 。
所以,要想匹配一个大写或者小写的r 接着任 何一个字符再接着一个t 就要使用这个表达式:[Rr].t 。
要想匹配行首的字符要使用抑扬字符(^)——有时也被叫做插入符。
例如,想找到text.txt 中行首"he"打头的行,你可能会先用简单表达式he ,但是这会匹配第三行的the ,所以要使用正则表达式^he ,它只匹配在行首出现的h 。
有时候指定“除了×××都匹配”会比较容易达到目的,当抑扬字符(^)出现在方括号中是,它表示“排除”,例如要匹配he ,但是排除前面是t or s 的情形(也就是the 和she ),可以使用:[^st]he 。
可以使用方括号来指定多个字符区间。
例如正则表达式[A-Za-z]匹配任何字母,包括大写和 小写的;正则表达式[A-Za-z][A-Za-z]* 匹配一个字母后面接着0或者多个字母(大写或者小写)。
当然我们也可以用元字符+做到同样的事情,也就是:[A-Za-z]+ ,和[A-Za-z][A-Za-z]*完全等价。
但是要注意元字符+ 并不是所有支持正则表达式的程序都支持的。
关于这一点可以参考后面的正则表达式语法支持情况。
要指定特定数量的匹配,要使用大括号(注意必须使用反斜杠来转义)。
想匹配所有10和100的 实例而排除1和 1000,可以使用:10\{1,2\},这个正则表达式匹配数字1后面跟着1或者2个0的模式。
在这个元字符的使用中一个有用的变化是忽略第二个数字, 例如正则表达式0\{3,\} 将匹配至少3个连续的0。
简单的例子这里有一些有代表性的、比较简单的例子。
vi 命令 作用:%s/ */ /g把一个或者多个空格替换为一个空格 :%s/ *$//去掉行尾的所有空格 :%s/^/ /在每一行头上加入一个空格 :%s/^[0-9][0-9]* //去掉行首的所有数字字符 :%s/b[aeio]g/bug/g 将所有的bag 、beg 、big 和bog 改为bug 。
:%s/t\([aou]\)g/h\1t/g 将所有tag 、tog 和tug 分别改为hat 、hot 和hut (注意用group 的用法和使用\1引用前面被匹配的字符)中级的例子例1将所有方法foo(a,b,c)的实例改为foo(b,a,c)。
这里a 、b 和c 可以是任何提供给方法foo()的参数。
也就是说我们要实现这样的转换:之前 之后foo(10,7,2) foo(7,10,2)foo(x+13,y-2,10) foo(y-2,x+13,10)foo( bar(8), x+y+z, 5) foo( x+y+z, bar(8), 5)下面这条替换命令能够实现这一魔法::%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g现在让我们把它打散来加以分析。
写出这个表达式的基本思路是找出foo()和它的括号中的三个参数的位置。
第一个参数是用这个表达式来识别的::\([^,]*\),我们可以从里向外来分析它:[^,] 除了逗号之外的任何字符[^,]* 0或者多个非逗号字符\([^,]*\) 将这些非逗号字符标记为\1,这样可以在之后的替换模式表达式中引用它\([^,]*\), 我们必须找到0或者多个非逗号字符后面跟着一个逗号,并且非逗号字符那部分要标记出来以备后用。
现在正是指出一个使用正则表达式常见错误的最佳时机。
为什么我们要使用[^,]*这样的一个表达式,而不是更加简单直接的写法,例如:.*,来匹配第一个参数呢?设想我们使用模式.*来匹配字符串"10,7,2",它应该匹配"10,"还是"10,7,"?为了解决这个两义性(ambiguity),正则表达式规定一律按照最长的串来,在上面的例子中就是"10,7,",显然这样就找出了两个参数而不是我们期望的一个。
所以,我们要使用[^,]*来强制取出第一个逗号之前的部分。
这个表达式我们已经分析到了:foo(\([^,]*\),这一段可以简单的翻译为“当你找到 foo(就把其后直到第一个逗号之前的部分标记为\1”。
然后我们使用同样的办法标记第二个参数为\2。
对第三个参数的标记方法也是一样,只是我们要搜索所有的字符直到右括号。
我们并没有必要去搜索第三个参数,因为我们不需要调整它的位置,但是这样的模式能够保证我们只去替换那些有三个参数的foo()方法调用,在foo()是一个重载(overoading)方法时这种明确的模式往往是比较保险的。