正则表达式学习

-----------------------------------------------------------------参考菜鸟教程-----------------------------------------------------------------------

概念:正则表达式(regular expression)是一种文本模式,包括普通字符(例如,a-z之间的字母)和特殊字符(称为“元字符”)。

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

 

为什么使用正则表达式?

典型的搜索和替换操作要求提供与预期的搜索结果匹配的确切文本。虽然这种技术对于静态文本执行简单的搜索和替换任务可能已经足够了,但是它缺乏灵活性,若采用这种方式搜索动态文本,即使不是不可能,至少也会变得很困难。

 

通过使用正则表达式,可以:

① 测试字符串内的模式。例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证

② 替换文本。可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者使用其他文本进行替换。

③ 基于模式匹配从字符串中提取子字符串。可以查找文档内或输入域内特定的文本。

 

发展历史:(只是因为觉得很牛批才写上的)

正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。

 

应用领域:

C#正则表达式http://www.runoob.com/csharp/csharp-regular-expressions.html;

java正则表达式http://www.runoob.com/java/java-regular-expressions.html

JavaScript正则表达式http://www.runoob.com/js/js-obj-regexp.html

Python正则表达式http://www.runoob.com/python/python-reg-expressions.html

Ruby正则表达式http://www.runoob.com/ruby/ruby-regular-expressions.html

 

语法

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

构造正则表达式的方法和创建数学表达式的方法一样,即用多种元字符与运算符可以将较小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

正则表达式是由普通字符(如a-z)以及特殊字符(称为“元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

 

·普通字符

普通字符包括没有显示指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

·特殊字符

所谓特殊字符,就是一些有特殊含义的字符。如“*”,如果要查找“*”,就要对其进行转义“\*”。

? 匹配前面的子表达式0次或1次,或指明一个非贪婪限定符(我倒觉得是匹配任意0个或11个字符);

* 用来匹配前面的子表达式0次或多次(我倒觉得是匹配任意0个或多个字符);

^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时表示它不接受该字符集合;

[0-9]+ 匹配多个数字;

[0-9] 匹配一个数字;

$ 匹配输入字符串的结束位置。如果设置了regexp对象的multiline属性,则$也匹配‘\n’或‘\r’;

+ 匹配前面的子表达式一次或多次;

() 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用;

. 匹配除换行符\n之外的任何单个字符,在中括号表达式中,只会匹配“.”,等价于\.;

[ 标记一个中括号表达式的开始;

\ 将下一个字符标记为特殊字符、原义字符、向后引用、八进制转义符;

{ 标记限定符表达式的开始;

| 指明两项之间的一个选择;

 

·限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*、+、?、{n}、{n,}、{n,m}6种。

* 匹配前面的子表达式0次或多次,等价于{0,};

+ 匹配前面的子表达式1次或多次,等价于{1,};

? 匹配前面的子表达式0次或1次,等价于{0,1};

{n} n是一个非负整数。匹配确定的n次;

{n,} n是一个非负整数。至少匹配n次。o{1,}等价于o+,o{0,}等价于o*;

{n,m} n和m均为非负整数,其中n<=m,最少匹配n次,最多匹配m次。o{0,1}等价于o?。注意在逗号和两个数字之间不能有空格;

 

*、+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们后面加一个?就可以实现非贪婪或最小匹配。通过在*、+或?限定符之后放置?,该表达式从贪心表达式转换为非贪心表达式或者最小匹配。

 

·定位符

定位符能够将正则表达式固定到行首或行尾。还能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。定位符用来描述字符串或单词的边界。

^ 匹配输入字符串开始的位置。如果设置了regexp对象的multiline属性,还会与\n或\r之后的位置匹配;

$ 匹配输入字符串结尾的位置。如果设置了regexp对象的multiline属性,还会与\n或\r之前的位置进行匹配;

\b 匹配一个字边界,及字与空格之间的位置;

\B 非字边界匹配;

 

注意:不能将限定符与定位符一起使用。由于在紧靠换行或者字边界的前面或后面不能有一个以上位置,因此不允许诸如^*之类的表达式。

 

/\bCha/匹配单词Chapter的开头三个字符,因为这三个字符出现在字边界后面;

/ter\b/匹配单词Chapter结尾的三个字符,因为它出现在字边界的前面;

/\Bapt/匹配单词Chapter中的字符串apt,但不匹配aptitude中的字符串apt,因为apt出现在Chapter的非边界处,而出现在aptitude的边界处;

 

·选择

用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项之前来消除这种副作用。

其中?:是非捕获元之一,还有两种非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

 

·反向引用

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从1开始,最多可存储99个捕获的子表达式。没个缓冲区都可以使用\n访问,其中n为一个标识特定缓冲区的一位或两位十进制数。

可以使用非捕获元字符“?:”、“?=”或“?!”来重写捕获,忽略对相关匹配的保存。

 

反向引用的最简单、最有用的应用之一,是提供查找文本中两个相同的相邻单词的匹配项的能力。以下面的句子为例:

It is the cost of of gasoline going up up?

上面的句子显然有多个重复的单词。可以设计一种方法定义该句子,而不必查找每个单词的重复出现:

var str = “It is the cost of of gasoline going up up?”

var patt1 = /\b([a-z]+) \1\b/ig;

document.write(str.match(patt1));

捕获的表达式,正如[a-z]+指定的,包括一个或多个字母。正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配。\1指定第一个子匹配项。

正则表达式后面的全局标记g指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配。

表达式结尾处的i标记指定不区分大小写。

多行标记指定换行符的两边可能出现潜在的匹配。

 

反向引用还可以将通用资源指示符(URI)分解为其组件。如将下面的URI分解为协议(ftp、http等)、域地址和页/路径:

var str = "http://www.runoob.com:80/html/html-tutorial.html";

var pattr1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;

arr = str.match(patt1);

for (var i = 0;i < arr.length;i++){

 document.write(arr[i]);

 document.write(“<br>”);

}

第一个括号子表达式捕获Web地址的协议部分。该子表达式匹配在冒号和两个正斜杠前面的任何单词。

\w匹配字母或数字或下划线或汉字及希腊字母、俄文的字母等(能不能匹配汉字要看操作系统和应用环境而定);

第二个括号子表达式捕获地址的域地址部分,匹配:和/之后的一个或多个字符。

第三个括号子表达式捕获端口号(如果指定了的话)。该子表达式匹配冒号后面的0个或多个数字。只能重复一次该子表达式。

\d匹配数字;

\s匹配任意的空白符

第四个括号子表达式捕获Web地址指定的路径和/或页信息。该子表达式能匹配不包括#或空格字符的任意字符序列。

 

·元字符

\ 将下一个字符标记为特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符;

^ 匹配输入字符串的开始位置。如果设置了regexp对象的multiline属性,也匹配’\n’或’\r’之后的位置;

$ 匹配输入字符串的结束位置。如果设置了regexp对象的multiline属性,也匹配’\n’或’\r’之前的位置;

* 匹配前面的子表达式0次或多次,等价于{0,};

+ 匹配前面的子表达式一次或多次,等价于{1,};

? 匹配前面的子表达式0次或一次,等价于{0,1}。当该字符紧跟在任何一个其他限制符(*、+、?、{n}、{n,}、{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串;

{n} n是一个非负整数,匹配确定的n次;

{n,} n是一个非负整数,至少匹配n次,等价于*;

{n,m} n和m均为非负整数,其中n <= m,最少匹配n次,且最多匹配m次,注意在逗号和两个数字之间不能有空格;

. 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括\n在内的所有字符,可用(.|\n);

(pattern) 匹配pattern并获取这一匹配。所获取的匹配可以从产生的matches集合得到,在VBScript中使用SubMatches结合,在JScript中则使用$0...$9属性。要匹配圆括号字符,可用\(和\);

(?:pattern) 匹配pattern但不获取匹配结果,即这是一个非获取匹配,不进行存储供以后使用。这在使用“或”字符|来组合一个模式的各个部分是很有用的。例如:industr(?:y|ies)就是一个比industry|industries更简略的表达式;

(?=pattern) 正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配。例如:“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”;

(?!pattern) 正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配。例如:“Windows(?=95|98|NT|2000)”不能匹配“Windows2000”中的“Windows”,但能匹配“Windows3.1”中的“Windows”;

(?<=pattern) 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。如:“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的Windows,但不能匹配“3.1Windows”中的WIndows;

(?<!pattern) 反向(look behind)否定预查,与正向否定预查类似,只是方向相反。如:“(?<=95|98|NT|2000)Windows”不能匹配“2000Windows”中的Windows,但能匹配“3.1Windows”中的WIndows;

x|y 匹配x或y;

[xyz] 字符集合。匹配所包含的任意一个字符。例如:[abc]可以匹配plain中的a;

[^xyz] 负值字符集合,匹配未包含的任意集合;

[a-z] 字符范围。匹配指定范围内的任意字符;

[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符;

\b 匹配一个单词边界,也就是指单词和空格间的位置;

\B 匹配非单词边界;

\cx 匹配由x指明的控制字符。例如\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一,否则,将c视为一个原义c字符;

\d 匹配一个数字字符,等价于[0-9];

\D 匹配一个非数字字符,等价于[^0-9];

\f 匹配一个换页符,等价于\x0c和\cL;

\n 匹配一个换行符,等价于\x0a和\cJ;

\r 匹配一个回车符,等价于\x0d和\cM;

\s 匹配任何空白字符,包括空格、制表符、换页符等等,等价于[\f\n\r\t\v];

\S 匹配任何非空白字符,等价于[^\f\n\r\t\v];

\t 匹配一个制表符,等价于\x09和\cI;

\v 匹配一个垂直制表符,等价于\x0b和\cK;

\w 匹配数字字母下划线,等价于[A-Za-z0-9];

\W 匹配非数字字母下划线,等价于[^A-Za-z0-9];

\xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。如:\x41匹配A;

\num 匹配num,其中num是一个正整数。对所获取的匹配的引用。如()\1匹配两个连续的相同字符;

\n 标识一个八进制转义值或向后引用。若\n之前至少n个获取的子表达式,则n为向后引用。否则,若n为八进制数字(0-7),则n为一个八进制转义值;

\nm 标识一个八进制转义值或一个向后引用。若\nm之前至少有nm个获得子表达式,则nm为向后引用。若\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。若前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm;

\nml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml;

\un 匹配n其中n是一个用四个十六进制数字表示的Unicode字符。如\u00A9匹配版权符号?;

 

·运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序,与算术表达式非常类似。相同优先级的从左到右进行运算,不同优先级的运算先高后低。

\ 转义符;

(),(?:),(?=),[] 圆括号和方括号;

*,+,?,{n},{n,},{n,m} 限定符;

^,$,\任何元字符、任何字符 定位点和序列(即:位置和顺序);

| 替换,“或”操作。字符具有高于替换运算符的优先级,使得“m|food”匹配m或food,若要匹配mood或food,应写成“(m|f)ood”;

 

·匹配规则

模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。

字符簇 []

确定重复出现:跟在字符或字符簇后面的花括号{}用来确定前面的内容重复出现的次数。如\b[a-z]{3}\b表示所有三个字母的单词;

大多数特殊字符在中括号表达式内出现时失去它们的意义。不过也有一些例外,如:

  1. 如果]字符不是第一项,它结束一个列表。若要匹配列表中的]字符,请将它放在第一位,紧跟在开始[后面;
  2. \字符继续作为转义字符,若要匹配\,使用\\;
  3. 若要在中括号表达式中匹配连字符-,请将它放在第一位或最后一位或使用转义符\-;

替换和分组:替换使用|字符来允许在两个或多个替换选项之间进行选择;分组使用圆括号();

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值