用来合营特定的字符串, 正则匹配式/abc/匹配原字符串abc匹配进度

用来匹配特定的字符串, 正则匹配式/abc/匹配原字符串abc匹配过程

正则表达式是讲述一组字符串特征的格局,用来同盟特定的字符串

一.正则表达式匹配原则

图片 1

原字符串

首要分多个部分:宗旨语法RegExp对象的格局、[JS中辅助正则表明式的String对象方法](http://www.cnblogs.com/gulei/p/6296663.html#a3)

并吞字符和零大幅

在正则表明式匹配过程中,假诺子表达式匹配到的是字符内容,并被保存在结果里面,那么就说该子表达式是挤占字符的。要是实说明式占有的只是岗位,可能尚未保留到结果中去,那么就说该子表明式是零小幅度的。

零肥瘦的子表明式在协作成功恐怕协作退步今后,把匹配权交给下1个子表明式,下1个子说明式会在零上涨幅度的子表达式地方上马。那是零上涨幅度的子表明式的性状,不占用字符宽度。

 

正则匹配格局 /abc/

 正则匹配式/abc/匹配原字符串abc匹配进度:

首先由字符a取得匹配权,因为它在/abc/中排第一个人,从地点0初叶匹配,匹配成功,然后保留结果a,把匹配权交给第3顺位b,b从岗位1早先匹配,匹配成功,保存结果并把匹配权交给c,c从职责2起来匹配,匹配成功保存结果,并出口匹配结果abc,先导地方为0,截止地方为3。

① 、基本语法

二.正则至极中用到的办法

1.直接量语法 /pattern/attributes;

2.创建RegExp对象的语法  var regepx = new RegExp(pattern,attributes);

参数 pattern
是一个字符串,制定了正则表明式的平整情势,attributes是八个可选参数,包罗三种性子i , g , m 分别是忽视大小写;全局匹配;分段匹配;

在JS中,正则表达式为目的,用如下二种艺术定义:

1.search()方法 

焦点语法: stringObject.search(regexp)

参数:regexp是须要在stringObject中搜寻的正则表明式 

重临值:重临在stringObject中第三个与regexp相匹配的职分,假若没有就回到
-1

专注:search()方法不支持全局属性g,而且它每一回都会在字符串的起来地方进行搜索。

直白量法: /pattern/attributes;创造RegExp对象法:new RegExp(pattern,attributes);

2.match()方法

骨干语法 stringObject.match(searchValue)
也许stringObject.match(regexp)

参数searchValue 要求摸索字符串的值 
regexp是内需在stringObject中搜索的正则表达式

返回值:
                 
它可以全局匹配形式,全局匹配的话,它回到的是3个数组。即便没有找到其余的二个一双两好,那么它将重返的是null;重回的数组内有几个成分,第1个因素的寄放的是匹配的公文,还有一个指标属性;index属性表明的是极度文本的开场字符在stringObject中的地点;input属性评释的是对stringObject对象的引用。

var reg=/hi/i;//字面量
var reg=new RegExp('hi','i');//构造函数(参数1:最简单的正则匹配字母hi;参数2:表示匹配时不分大小写)

3.replace()方法

该措施用于在字符串中选取一些字符替换另一部分字符,只怕替换一个与正则表明式匹配的子字符串

基本语法: stringObject.replace(regexp/substr,replacement);

参数:regexp/substr; 字符串或许须要替换形式的RegExp对象

         
 replacement:1个字符串的值,被替换的文书恐怕生成替换文本的函数

重回值:重临替换后的新字符串

 

4.split()方法

该措施把一个字符串分割成字符串数组。

基本语法:stringObject.split(separator,howmany);

separator[必填项],字符串或正则表明式,该参数内定的地方分割stringObject;

 howmany[可选]
该参数钦命再次来到的数组的最大尺寸,如果设置了该参数,重返的子字符串不会多于那几个参数钦命的数组。若是没有安装该参数的话,整个字符串都会被细分,不考虑她的长短。

重临值:被切割的字符串数组

元字符:( [ { \ ^ $ | ) ? * + .(若匹配元字符本身供给转义)

5.test()方法

主干语法:RegExpObject.test(str);

参数:str是要检查和测试的字符串

再次回到值:要是与被检查和测试字符串想匹配,重临true,反之,重临false;

 1、直接量

三.JavaScript正则表明式中的元字符

  最简便的正则匹配格局,使用字符本人进行匹配

    元字符                                   含义

      .                                                   
查找任意的单个字符,除换行符外

    \w                                                 
任意1个假名或数字或下划线,A_Za_Z0_9,_中任                      
                                                                     
                              意一个 

    \W                                                 
查找非单词的字符

    \d                                                   
匹配贰个数字字符

    \D                                                   
匹配三个非数字字符

    \s                                                   
匹配任何空白字符,包蕴空格,制表符,换行符等  

    \S                                                   
匹配任何非空白字符

    \b                                                   
匹配三个单词边界,也正是指单词和空格间的岗位 

    \B                                                   
匹配非单词边界

    \0                                                     
查找NUL字符

    \n                                                      
匹配三个换行符

    \r                                                      
匹配二个回车符

    \v                                                      
匹配一个垂直制表符

var reg=/hi/;//匹配一个hi字符

 四.正则表明式中[] 方括号的意义

  [abc]                                    匹配abc中的任意三个字符

  [0-9]                                     匹配数字0-9中的任意一个

  [a-z]                                    
匹配小写字母a-z中的任意1个

(a|b|c)                               等价于[abc]
 匹配abc中的任意3个

在方括号[]中最前面加上^符合能够象征取反

[^abc]                                   匹配除了abc之外的妄动字符

[^a-z]                                  
 匹配除了小写字母a-z之外的有所字符

 2、元字符

 五.正则表明式中的量词和转义

   正则表明式中在急需转义的特殊字符前面加上  \ 

   如 ^字符表示非常起来地点的字符 包涵^自身的话 须要选用 ^\

  元字符是有个别标记和字母的咬合,用来替代普通字符,元字符有.\d\w\s等,详尽附表

量词

量词                                         描述

n+                                           
匹配任何至少含有1个n的字符串

n*                                           
匹配零个恐怕三个n的字符串

n?                                           
匹配零个依然一个n的字符串

n{x}                                         
匹配包涵x个n的行列字符串

n{x,y}                                       
匹配至少x个,最多y个n的字符串

n{x,}                                          匹配至少x个的字符串

n$                                            匹配以n结尾的字符串

^n                                            匹配以n初叶的字符串

?=n                                        匹配其后交接钦命的n字符串

?!n                                         
匹配其后并未连接钦赐的n字符串

var reg=/./;// .表示除换行符以外的任一字符
var reg=/\d/;// \d表示0-9的数字
...

六.贪婪形式与非贪婪情势

贪欲方式:匹配行为在合营成功的前提下,继续同盟,尽恐怕多的功成名就匹配一回。

非贪婪模式:匹配行为在极度成功后,不再进行匹配行为。

大规模的唯利是图方式量词:{x,y} ,  {x,} ,  ? ,  * , 和  +

非贪婪方式在物欲横流方式量词后增加1个?号,就足以把贪婪形式成为非贪婪格局

{x,y}?,{x,}?,??,*?,和 +?

 叁 、字符转义

  借使急需寻找元字符自己,则供给在元字符从前加\举行转义 

var reg=/\./;//匹配一个.
var reg=/\\/;// 匹配一个\

 4、重复

  量词用于限定它前边表明式匹配的次数,有*+?{}等

var reg=/\d\d\d/;//匹配3个数字
var reg=/\d*/;//匹配任意数量数字,可能是0个
var reg=/\d+/;//匹配1个到多个数字
var reg=/\d?/;//匹配0到1个数字
var reg=/\d{3}/;//匹配3个数字
var reg=/\d{3,}/;//匹配3到多个数字
var reg=/\d{3,6}/;//匹配3到6个数字

 5、字符类

  在[]的限量中添加字符,在中括号内的元字符不需求展开转义‘-’表示至,它的效应为在括号中任选其一

var reg=/[abc]/;//匹配'a','b','c'其中之一
var reg=/[() +\]/;//匹配'(',')',' ','+','\'其中之一,[]内部不需要转义
var reg=/[0-9a-z]/;//匹配0至9和a至z,即[0123456789abcdefghijklmnopqrstuvwxyz]
var reg=/[0-9][a-z]/;//匹配前一个数字后一个字母的两位字符,区别于上述匹配一位字符

六 、分支条件

  使用|把分歧规则分隔开分离,类似条件选用,从左到右依次测试各个条件,满意其中任一条件即可,当满足有些分枝成功后就不再管别的的道岔了

var reg=/0\d{2}-\d{8}|0\d{3}-\d{7}/;//匹配固定电话:前3后8或前4后7,即021-12345678或0553-7654321

7、分组

  使用()来包裹子表明式,以便对那部分子表明式全部操作,如重复或后向引用

var reg=/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/;//匹配IP地址
//意思为:((一个不大于255的数字)+‘.’)整体重复三次+(一个不大于255的数字)

8、反义

  查找不属于钦定项目以外的字符,有\D\W\S[^]等,其中\D等价于[^\d] 除数字以外任意字符

var reg=/[^abc]/;//匹配一个不是abc的字符,即除abc以外的任一字符

 九 、后向引用

  使用()分组匹配的子表明式,将电动拥有二个分组编号,可用未来续重复引用

var reg=/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}\2/;//这里有分组有嵌套,\1代表外层分组(下划线),\2表示内层分组(红色)

  能够自定义分组编号(即命名)语法为:(?<name>exp)或(?’name’exp),将分组命名为name,再反向引用时语法为:\k<name>

var reg=/((?<name>2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}\k<name>/;//给分组2命名为name,后续可用该名称来引用

  还能忽略当前分组获得自行编号(即潜伏分组),语法为(?:exp)

var reg=/(?:(2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}\1/;//因为第一个分组被忽略,原来的分组2变为了分组1

 ⑩ 、零宽度断言(也称环视)

  用于查找在好几内容(但并不包涵那么些剧情)此前或之后的东西,类似\b^$钦赐贰个岗位,那一个职责要满意一定的规格(断言)

  (?=exp)正前瞻,本身现身的职责的末尾能匹配表明式exp,如:\b\w+(?=ing\b),匹配以ing结尾的单词的先尾部分,等同于下划线部分

  (?!exp)反前瞻,本身现身的职位的背后不可能匹配表达式exp,如:\babc(?!ing\b),匹配不以ing结尾的abc先河单词的abc,等同于下划线部分

  (?<=exp)正后顾,本身出现的岗位的前方能匹配表达式exp,如:(?<=\bre)\w+\b,匹配以re起始的单词的后半某些,等同于下划线部分(JS不接济)

  (?<!exp)反后顾,本人现身的职位的后面不可能协作表明式exp,如:(?<!\bre)abc\b,匹配以re早先的abc结尾单词的abc,等同于下划线部分(JS不援助)

var str='reading';
var reg=/read(?=ing)/g;//正前瞻:在我们捕获read这个字符串时,筛选它接下来的字符串是不是ing
console.log(str.match(reg)[0]);//read

 1一 、贪婪和懒惰

  正则说明式匹配时,经常在使任何表明式能赢得匹配的前提下,会协作尽或许多的字符,这被誉为贪婪匹配若需求懒惰匹配(即尽大概少的字符),那么一旦在界定重复的松软量词后加?即可

var str='aabab';
console.log(str.match(/a.*b/)[0]);//aabab 默认贪婪模式
console.log(str.match(/a.*?b/)[0]);//aab 开启懒惰模式 
代码/语法 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

 

 

 

 

 

 1贰 、处理选项

  即匹配规则,是不是忽略大小写,多行等

名称 说明
IgnoreCase(忽略大小写) 匹配时不区分大小写。
Multiline(多行模式) 更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)
Singleline(单行模式) 更改.的含义,使它与每一个字符匹配(包括换行符\n)。
IgnorePatternWhitespace(忽略空白) 忽略表达式中的非转义空白并启用由#标记的注释。
ExplicitCapture(显式捕获) 仅捕获已被显式命名的组。

 

附表:常用元字符详解

元字符 类型 说明
\ 特殊 转义符号,或将下一个字符标记为特殊字符(如\d)
| 特殊 分支条件,类似条件选择把不同规则分隔开
() 特殊 分组
[] 特殊 限定字符,如[abc]
[^] 特殊 负值字符串,如[^abc]除abc以外的任何字符
{} 特殊 限定次数
^ 位置 匹配字符串的开始
$ 位置 匹配字符串的结束
\b 位置 单词的开头或结尾,也就是单词的分界处
* 量词 重复零次或更多次(任意次)
+ 量词 重复一次或更多次(至少出现一次)
量词 重复零次或一次(最多出现一次)
{n} 量词 重复n次,n为数字
{n,} 量词 重复n次到无数次
{n,m} 量词 重复n次到m次
. 匹配 匹配除换行符以外的任意字符
\d 匹配 匹配一个数字字符,等价于[0-9]
\w 匹配 匹配字母或数字或下划线或汉字,只考虑英文情况下等价于[a-zA-Z0-9_]
\s 匹配 匹配任意的空白符

 

贰 、RegExp对象的方法

1、test()**

  主干语法:**RegExpObject.test(str);**

**  **该办法用于检查和测试2个字符串是不是匹配某些方式(即加以的字符串使用该正则是还是不是能同盟到剧情),重返二个布尔值

var str="hello world";
var regexp=new RegExp("hello");//构造函数创建RegExp对象
console.log(regexp.test(str));//true
console.log(/hi/.test(str));//false,//字面量

2、exec()

  基本语法:RegExpObject.exec(str)**;**

  该措施用于检索字符串中的正则表明式的匹配,重临多少个匹配结果的数组,假设没有匹配重临null;不是大局的情事下与match()方法重返的数值相同

var str="hello world";
console.log(/hello/.exec(str));//["hello", index: 0, input: "hello world"] 
//第一为匹配的内容,第二为匹配的索引位置,第三为字符串本身
console.log(/hi/.exec(str));//null
console.log(/ello/.exec(str).index);//1 //index和input可以直接作为该方法返回的两个属性

 

 

③ 、JS中协助正则表明式的String对象方法

1、search()

  查找:stringObject.search(regexp/str);

  该方式用于检索字符串中钦定的子字符串,或探寻与正则表明式相匹配的字符串,它不履行全局匹配(将忽略标志g),也向来不regexp对象的lastIndex属性,且一而再从字符串初阶地点举行搜索,总是回到的是stringObject匹配的首先个地方

var str = "hello"; 
console.log(str.search(/l/)); //2 返回匹配到的第一个位置(使用的regexp对象检索)
console.log(str.search('l')); //2 使用字符串进行匹配
console.log(str.search(/l/g)); //2 没有全局的概念 总是返回匹配到的第一个位置
console.log(str.search(/L/i)); //2 可以忽略大小写来检索
console.log(str.search(/a/)); //-1,如果没有检索到的话,则返回-1

2、match()

  匹配:stringObject.match(regexp/str

  该措施用于在字符串内寻找钦赐的值,或找到三个还是三个正则表明式的协作。该办法类似于indexOf()或然lastIndexOf(); 不过它回到的是点名的值,而不是字符串的职责;

var str = "hello"; 
console.log(str.match(/e/)); //["e", index: 1, input: "hello"] 返回一个数组,包括匹配到的字符,位置和自身
console.log(str.match('e'));//["e", index: 1, input: "hello"] 支持用字符串代替正则进行匹配
console.log(str.match(/l/g));//["l", "l"]支持全局匹配,返回匹配到的字符组成的数值

3、replace()

  替换:stringObject.replace(regexp/str,str/function);

  该方法用于在字符串中使用部分字符替换另一对字符,或然替换二个与正则表明式匹配的子字符串;暗中认可只替换第一个地位卓殊的字符,能够加修饰符g举行全局替换。全部再次来到替换后的新字符串。

var str = "hello world";
console.log(str.replace("hello","a"));// a world,使用字符串匹配并替换
console.log(str.replace(/hello/,"b"));// b world,使用正则匹配并替换
console.log(str.replace(/l/g,""));// heo word,使用正则加装饰符g进行全局替换
console.log(str.replace(/(hello)[ ](\w+)/g,"$2 $1"));// world hello,$1,$2 代表正则中第一个和第二个分组所匹配的文本
//第二个参数是function函数
console.log(str.replace(/o/g,function(v){
  console.log(v);//打印2次o
  return '-';
}));//hell- w-rld,匹配替换为函数的返回值
console.log(str.replace(/(e).*(o)\b/g,function(){
  console.log(arguments);//["ello", "e", "o", 1, "hello world"]
  //第一个匹配的字符,第二和第三是分组匹配的内容,第四是匹配索引位置,第5个是原字符串
  return 'i';
}));// hi world

4、split()

  分割:stringObject.split(regexp/substr,[length]);

  该办法把贰个字符串分割成字符串数组,length设定重临数组的尺寸即超越部分将被忽略(可选参数)

var str = "hello world";
console.log(str.split(" ");//["hello", "world"],使用字符分割为数组
console.log(str.split(/o/g));//["hell", " w", "rld"],使用正则匹配的内容来分割
console.log(str.split(/o/g,2));//["hell", " w"],指定返回数组的length