JavaScript(12):RegExp正则表达式对象

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。

搜索模式可用于文本搜索和文本替换。

一、正则表达式

正则表达式是由一个字符序列形成的搜索模式。当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。

正则表达式可以是一个简单的字符,或一个更复杂的模式。正则表达式可用于所有文本搜索和文本替换的操作。

1、语法:

(1)使用RegExp对象初始化:

var patt=new RegExp(pattern,modifiers);

(2)使用字面量初始化:(常用)

var patt= /pattern/modifiers
  • pattern(模式) 描述了表达式的模式
  • modifiers(修饰符) 用于指定全局匹配、区分大小写的匹配和多行匹配

其中修饰符是可选的。如:

var patt = /runoob/i

2、实例解析:

/runoob/i 是一个正则表达式。

runoob 是一个正则表达式主体 (用于检索)。

i 是一个修饰符 (搜索不区分大小写)。

1、正则表达式应用举例

1、限制输入

onkeyup="value=value.replace(/[^\d]/g,'') "
onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

2、校验合法性:

            if(/^[0-9]*$/.test($("input_code").val()))
            { alert("只能输入数字");}

3、用正则表达式从URL地址中提取文件名

s="http://www.9499.net/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s) //page1

2、计算字符串的长度

(一个双字节字符长度计2,ASCII字符计1)

String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

二、正则表达式修饰符

修饰符 可以在全局搜索中不区分大小写:

  1. i:执行对大小写不敏感的匹配。
  2. g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
  3. m:执行多行匹配。

三、正则表达式模式

1、JS中正则表达式支持的元字符:

  1. 枚举方括号表达式,范围方括号表达式,枚举取反方括号表达式,范围取反方括号表达式
  2. . \w \W \d \D \s \S \b \B \n \r \f \v \888 \uffff \xff
  3. n? n+ n* n{a} n{a,} n{a,b}及这些量词的非贪婪模式
  4. ^ $ (?!) (?=) (?:)
  5. |

其他:

  1. JS中引用分组请用\number,且不支持''和<>这样的命名分组
  2. 不支持量词的占有模式
  3. 不支持逆向环视
  4. 方括号表达式中复合表达式仅支持如下:[abc0-9] [abc\d] [\d\w^&]等等类似的
  5. 支持修饰符组合,比如gim mig gi ig等等,无顺序要求

2、部分举例:

方括号:用于查找某个范围内的字符:

  • [abc]:查找方括号之间的任何字符。
  • [0-9]:查找任何从 0 至 9 的数字。
  • (x|y):查找任何以 | 分隔的选项。

元字符:是拥有特殊含义的字符:

  • \d:查找数字。
  • \s:查找空白字符。
  • \b:匹配单词边界。
  • \uxxxx:查找以十六进制数 xxxx 规定的 Unicode 字符。

量词:

  • n+:匹配任何包含至少一个 n 的字符串。
  • n*:匹配任何包含零个或多个 n 的字符串。
  • n?:匹配任何包含零个或一个 n 的字符串。

四、使用 RegExp 对象

在 JavaScript 中,RegExp 对象是一个预定义了属性和方法的正则表达式对象。

RegExp 对象属性:   

  • global判断是否设置了 "g" 修饰符
  • ignoreCase判断是否设置了 "i" 修饰符
  • multiline判断是否设置了 "m" 修饰符
  • lastIndex用于规定下次匹配的起始位置
  • constructor返回一个函数,该函数是一个创建 RegExp 对象的原型。
  • source返回正则表达式的匹配模式

1、test():测试是否匹配

检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。

1、以下实例用于搜索字符串中的字符 "e":

var patt = /e/;
patt.test("The best things in life are free!");

字符串中含有 "e",所以该实例输出为:

true

也可以不用设置正则表达式的变量,以上两行代码可以合并为一行:

/e/.test("The best things in life are free!")

2、Javascript 判断是移动端浏览器还是 PC 端浏览器:

if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
    document.write("移动")
} else {
    document.write("PC")
}

其他说明:该方法将忽略"g"标志,只要查找到符合模式的字符串即匹配成功。(如果正则对象含有"g"标志,那么每次使用test()将从lastIndex位置开始匹配,匹配成功会更新lastIndex属性值;没有"g"标志,test()将从字符串起点开始匹配,也不会对lastIndex做更新)

2、exec():执行匹配

检索字符串中的正则表达式的匹配。和String的match()方法很类似。

1、该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。返回的数组是Array实例,但还包含额外两个属性:indexinput

  • index:表示匹配项在字符串中的起始位置
  • input:表示应用正则表达式的字符串。

当使用(...)分组匹配时,一次exec()会匹配到多个结果

var exp = /(there)\s+(you)\s+(are)/;
var matches = exp.exec('hey, there you are my dear');

返回:matches = ["there you are", "there", "you", "are"];

matches[0]:匹配整个表达式字符串。

matches[1]:匹配第一个(...)内的字符串,之后以此类推。

注意:含(?:...)非捕获分组的表达式执行exec后返回的数组中不包含(?:...)匹配的字符串。

2、以下实例用于搜索字符串中的字母 "e":

/e/.exec("The best things in life are free!");

字符串中含有 "e",所以该实例输出为:

e

其他说明:

(1)若开启"g"标志,执行exec()匹配成功一次以后,再次执行exec()时,会从前一次匹配的最后一位开始继续向后匹配。例:

var exp = /.at/g
var matches = exp.exec('cat, bat, sat, fat'); //第一次匹配
matches.index => 0
matches.input => 'cat, bat, sat, fat'
matches => ['cat']
exp.lastIndex => 3

matches = exp.exec('cat, bat, sat, fat'); //第二次匹配
matches.index => 5
matches.input => 'cat, bat, sat, fat'
matches => ['bat']
exp.lastIndex => 8

(2)若没开启"g"标志,执行exec()匹配成功一次以后,再次执行exec()时,会从头开始重新匹配。

var exp = /.at/
var matches = exp.exec('cat, bat, sat, fat'); //第一次匹配
matches.index => 0
matches.input => 'cat, bat, sat, fat'
matches => ['cat']
exp.lastIndex => 0

matches = exp.exec('cat, bat, sat, fat'); //第二次匹配
matches.index => 0
matches.input => 'cat, bat, sat, fat'
matches => ['cat']
exp.lastIndex => 0

五、支持正则表达式的 String 对象的方法

1、search(yourRegexpOrString)方法:搜索

用于检索与正则表达式相匹配的子字符串,并返回子串的起始位置。

使用正则表达式搜索 "Runoob" 字符串,且不区分大小写:

var str = "Visit Runoob!"; 
var n = str.search(/Runoob/i);

输出结果为:

6

其他说明:该方法将忽略"g"标志和正则对象的lastIndex属性(即总是从开头找起),返回找到的第一个字符的位置,如果未找到返回-1。

search() 方法也可以直接使用字符串作为参数。

字符串参数会转换为正则表达式:

检索字符串中 "Runoob" 的子串:

var str = "Visit Runoob!"; 
var n = str.search("Runoob");

2、match(yourRegexpOrString)方法:匹配

在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

其他说明:

  • 若没开启"g"标志,将只查找第一个匹配的字符串,返回一个对象,包含下标0、index、input,其中下标0等价于index,input是String的引用;
  • 若开启"g",返回一个数组,数组的length是匹配的字符串个数,每个元素是每个匹配的起始字符位置。
  • 如果没有找到任何匹配的文本, match() 将返回 null。

在字符串中查找 "ain":

var str="The rain in SPAIN stays mainly in the plain"; 
var n=str.match(/ain/g);

n 输出数组结果值:

ain,ain,ain

判断是否微信浏览器:

function is_weixn(){  
    var ua = navigator.userAgent.toLowerCase();  
    if(ua.match(/MicroMessenger/i)=="micromessenger") {  
        return true;  
    } else {  
        return false;  
    }  
}

3、replace(yourRegexpOrString,placementString):替换

用于替换一个与正则表达式匹配的子串。

使用正则表达式且不区分大小写将字符串中的 Microsoft 替换为 Runoob :

var str = document.getElementById("demo").innerHTML; 
var txt = str.replace(/microsoft/i,"Runoob");

结果输出为:

Visit Runoob!

其他说明:如果没有"g"标志只会替换一次,并且如果参数是字符串而不是正则对象始终替换一次。

placementString中$有特殊用途,见下表:

  • $1、$2、...、$99:regexp中捕获的引用分组。
  • $&:本次匹配的文本。
  • $`:本次匹配到的子串左侧的文本。
  • $':本次匹配到的子串右侧的文本。
  • $$:$本身。

该方法的第二个参数也可以为一个函数。

replace() 方法使用字符串也可以作为参数:

var str = document.getElementById("demo").innerHTML; 
var txt = str.replace("Microsoft","Runoob");

正则表达式参数可用在以上方法中 (替代字符串参数)。

4、split(yourRegexpOrString[,howMany])方法:分割

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

其他说明:是arr.join(separatorString)反操作,如果传入"",则每个字符都将会被分隔到数组。howMany指定返回数组的个数。

注意: split() 方法不改变原始字符串。

把一个字符串分割成字符串数组:

var str="How are you doing today?";
var n=str.split(" ");

n 输出一个数组的值:

How,are,you,doing,today?

posted on 2019-03-15 14:54  springsnow  阅读(325)  评论(0编辑  收藏  举报

导航