在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
常用的元字符
. 匹配除换行符以外的任意字符
| 逻辑或
- 定义一个区间[0-9]
\ 对下一个字符转义
* 匹配任意字符0或多次
+ 匹配任意字符一次或多次
? 0次或一次
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符 \d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[ax] 匹配a或x的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
常用的限定符
l {n} 重复n次
l {n,} 重复n次或更多次
l {n,m} 重复n到m次
l 代码/语法 说明 *? 重复任意次,但尽可能少重复
l +? 重复1次或更多次,但尽可能少重复
l ?? 重复0次或1次,但尽可能少重复
l {n,m}? 重复n到m次,但尽可能少重复
l {n,}? 重复n次以上,但尽可能少
.匹配单个字符
例子一...
文本:
Hello,my name is Sam.my pet is dog.
正则表达式:
name
结果:
匹配个数1,
注意:正则表达式默认区分字母大小写。
----------------------------------
例子二...有多个匹配结果
文本:
Hello,my name is Sam.my pet is dog.
正则表达式:
my
结果:
匹配个数2,
----------------------------------
例子三...匹配任意单个字符
文本:
ab
c
正则表达式:
.b
结果:
匹配个数1,
如果正则表达式:
.a
结果:
匹配个数为0
如果正则表达式:
.c
结果:
匹配个数为0
说明:点.是任意单个字符,不包括没有和换行符。
-------------------------------------------------------------------------
第三章 匹配一组字符
例子一...匹配多个字符中的某一个
文本:
Hello,my name is Sam.my pet is dog.
正则表达式:
[ea]ll
结果:
匹配个数1,匹配的结果字符串是ell
说明:方括号[]里面的多个字符,里面的任意一字符可拿出来,但仅仅是拿出一个,不能两个或以上。
----------------------------------
例子二...利用字符集合区间
文本:
sales1.xlsorders3.xlssales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
正则表达式:
[ns]a[0-9]\.xls
结果:
匹配个数3,匹配的位置分别是69,78,87
说明:所谓字符区间[0-9]表示[0123456789],然后[A-Z],[a-z],[A-F]你懂的。字符区间的首,尾字符可以是ASCII字符表里的任意字符。
----------------------------------
例子三...取非匹配
文本:
sales1.xlsorders3.xlssales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
正则表达式:
[ns]a[^0-9]\.xls
结果:
匹配个数1,说明:^这个符号表示对字符区间集合进行取非操作,比如[^0-9]表示不是任何数字的字符
-------------------------------------------------------------------------
第四章 使用元字符
例子一...匹配空白字符
文本:
sales1.xlsorders3.xlssales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
正则表达式:
\n\r
结果:
匹配个数0.
如果正则表达式:
\n
结果:
匹配个数8
如果正则表达式:
\r
结果:
匹配个数8.匹配的位置分别是31,43,54,67,76,85,94,103。
如果正则表达式:
\r\n
结果:
匹配个数8.匹配的位置分别是31,43,54,67,76,85,94,103。
说明:在Windows操作系统,文本行的结束标签是\r\n。下面是一个空白元字符的对照表
[\b] 回退字符(Backspace键)
\f 换页符
\n 换行符
\r 回车符
\t 制表符(Tab键)
\v 垂直制表符
----------------------------------
例子二...匹配数字(非数字),匹配字母和数字(与非字母和数字),匹配空白字符
说明:
\d等同于[0-9],等同于[0123456789]; \D等同于[^0-9];
\w等同于[a-zA-Z0-9_]就是任何一个大小写字母和数字和下划线;\W等同于[^a-zA-Z0-9_]
\s等同于[\f\n\r\t\v]就是空白字符啦,\S等同于[^\f\n\r\t\v]
-------------------------------------------------------------------------
第五章 重复匹配
例子一...匹配一个或多个字符
文本:
My Email is ttt@ccc.com.It is a good Email!
正则表达式:
\w+@\w+\.\w+
结果:
匹配个数1,匹配的位置是12
说明:+表示匹配一个或多个字符(至少一个,不匹配零个字符的情况)
文本:
My Email is rrr.ttt@ccc.com.It is a good Email!
正则表达式:
\w+@\w+\.\w+
结果:
匹配个数1,匹配到的字符串是ttt@ccc.com
如果正则表达式:
[\w.]+@\w+\.\w+
结果:
匹配个数1,匹配到的字符串是rrr.ttt@ccc.com
说明:我们没有对字符集合[\w.]里面的.字符进行转义,但最后还是匹配出来。一般来说,在[]里面的元字符.和+都被解释为普通字符,不需转义。当然,转义了也没坏处。
----------------------------------
例子二...匹配零个或多个字符
文本:
Hello .god@hotmail.com is my Email!
正则表达式:
[\w.]+@\w+\.\w+
结果:
匹配到的字符串是.god@hotmail.com
如果正则表达式:
\w+[\w.]*@\w+\.\w+
结果:
匹配到的字符串是god@hotmail.com
说明:*这个符号表示匹配零个或多个字符,也就是表示可有可无的意思。
文本:
Hello .god.@hotmail.com is my Email!
正则表达式:
\w+[\w.]*@\w+\.\w+
结果:
匹配到的字符串是god.@hotmail.com
如果正则表达式:
\w+[\w.]*\w@\w+\.\w+
结果:
没有匹配字符串
----------------------------------
例子三...匹配零个或一个字符
文本:
The URL is http://www.g.cn,to connect securely use https://www.g.cn/ instead
正则表达式:
http://[\w./]+
结果:
匹配个数为1,匹配到的字符串是http://www.g.cn
如果正则表达式:
https?://[\w./]+
结果:
匹配个数为2,匹配到的字符串分别是http://www.g.cn和https://www.g.cn/
说明:?这个符号表示的是,我前面的字符要么不出现,要么最多出现一次。
----------------------------------
例子四...设定确定匹配次数,至少匹配几次,匹配几次到几次
文本:
The URL is http://www.g.cn,to connect securely ww
正则表达式:
w{3}
结果:
匹配个数为1,匹配到的字符串是www。
说明:{3}表示前一个字符必须重复出现三次才算一个匹配 。
如果正则表达式:
w{1,3}
结果:
匹配个数为2,匹配到的字符串是www和ww。
说明:{1,3}表示前一个字符出现一次到三次。
如果正则表达式:
w{3,}
结果:
匹配个数为1,匹配到的字符串是www。
说明:{3,}表示前一个字符至少出现三次。
----------------------------------
例子五...防止过度匹配
文本:
<b>AI</b> and <b>BI</b>
正则表达式:
<b>.*</b>
结果:
匹配个数为1,匹配到的字符串是<b>AI</b> and <b>BI</b>
说明:如果我们希望匹配的是<b>AI</b>和<b>BI</b>,说明原先匹配被过度了。
如果正则表示:
<b>.*?</b>
结果:
匹配个数为2,匹配到的字符串是<b>AI</b>和<b>BI</b>
贪婪元字符*对应懒惰元字符*?
贪婪元字符+对应懒惰元字符+?
贪婪元字符{n,}对应懒惰元字符{n,}?
第六章匹配位置
匹配边界
文本
The cat scattered his food all over the room
正则
\bcat\b
结果 cat
<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions targetNamespace="http://tips.cf "
xmlns:impl="http://tips.cf" xmlns:intf="http://tips.cf"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
正则表达式
^\s*<\?xml.*\?>
结果
<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions targetNamespace="http://tips.cf "
xmlns:impl="http://tips.cf" xmlns:intf="http://tips.cf"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
Echo “abcdef” | grep ^a\b+f$ //匹配成功 grep 不支持\b
^ 开头 $结尾
第七章子表达式
文本
Hello, my name is Ben Forta, and I am
the author of books on SQL, ColdFusion, WAP,
Windows 2000, and other subjects.
正则表达式
( ){2,}
结果
Hello, my name is Ben Forta, and I am
the author of books on SQL, ColdFusion, WAP,
Windows 2000, and other subjects.
文本
ID: 042
SEX: M
DOB: 1967-08-17
Status: Active
正则表达式
(19|20)\d{2}
结果
ID: 042
SEX: M
DOB: 1967 -08-17
Status: Active
使用后向引用匹配
文本
This is a block of of text,
several words here are are
repeated, and and they
should not be.
正则表达式
[ ]+(\w+)[ ]+\1
结果
This is a block of of text,
several words here are are
repeated, and and they
should not be.
向前查找
正则
.+(?=:)
结果
向后是 ?<=
JS用法
stringObject.search(regexp/i(大小写)) 返回索引值
stringObject.match(regexp) 返回匹配字符串
stringObject.replace(regexp,replacement) 返回替换之后的字符串
RegExp 是正则表达式的缩写。
RegExp 对象用于存储检索模式。
RegExp 对象有 3 个方法:test()、exec() 以及 compile()。
test() 方法检索字符串中的指定值。返回值是 true 或 false。
exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
compile() 方法用于改变 RegExp。
例子:
var patt1=new RegExp(/\w/);
document.write(patt1.test("The best things in life are free"));
由于该字符串中存在字母,以上代码的输出将是:true
PHP用法
ereg(pattern, string)
< ?php
if (ereg(“^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+”,$email)){
echo “Your email address is correct!”;}
else{
echo “Please try again!”;
}
?>
array preg_grep ( string pattern, array input [, int flags] )
preg_grep() 返回一个数组,其中包括了input 数组中与给定的pattern 模式相匹配的单元。
$arr = array('abc'=>12.213,'bb'=>12345,'ba'=>23.2321,34.3,'23'=>'3.3','23434'=>'bbb');
$fl_array = preg_grep("/^\d+\.\d+$/", $arr);
print_r($fl_array);
Array ( [abc] => 12.213 [ba] => 23.2321 [0] => 34.3 [23] => 3.3 )
int preg_match ( string pattern, string subject ,[ array matches ,[int flags]] )
在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
在subject 中搜索pattern 模式的匹配项并替换为replacement。如果指定了limit,则仅替换limit 个匹配,如果省略limit 或者其值为 -1,则所有的匹配项都会被替换。
array preg_split ( string pattern, string subject [, int limit [, int flags]] )
返回一个数组,包含 subject 中沿着与 pattern 匹配的边界所分割的子串。
Grep 命令
-E –v –i –r -f
grep "[A-Z][9]D" test.txt 显示输出第一个字符的范围是“A-D”,第二个字符是“9”,第三个字符的是“D”的所有的行
grep "9\{3,\}" test.txt 模式出现几率查找:显示输出字符“9”至少重复出现三次的所有行
ls -l |grep "^d" 如果要查询目录列表中的目录 同:ls -d *
ls -l |grep "^d[d]" 在一个目录中查询不包含目录的所有文件
ls -l |grpe "^d…..x..x" 查询其他用户和用户组成员有可执行权限的目录集合
Rewrite
Rewrite是一种服务器的重写脉冲技术, 它可以使得服务器可以支持 URL 重写,是一种最新流行的服务器技术。它还可以实现限制特定IP访问网站的功能。很多情况下,某个 IP 的访问很容易造成 CPU 100% (比如 某些搜索引擎的固定抓取,别人大量的采集站点),这个时候我们就要利用一些有效的手段封掉对方的 IP,让他无法消耗服务器的资源,封 IP 的方法有很多种,如果你的 Web 服务器安装了 Rewrite 模块的话,也可以试试利用 Rewrite 规则封掉对方的 IP。
RewriteRule /about\.htm /index.html
例如我们把某个特定的 IP 直接重定向到 baidu 首页,在网站根目录的 .htaccess 文件里添加代码:
Code:
RewriteCond % 123.123.123.123 [NC]RewriteRule ^(.*)$ http://www.baidu.com/$1 [R=301] 将 123.123.123.123 这个 IP 替换成您要限制的 IP 即可