简朴进修 JavaScript 正则表达式

为何要用正则表达式

简朴的说:我们与字符串打仗的频次异常之高,正则表达式能够极大的进步庞杂文本剖析的效力,疾速婚配出庞杂的字符串。

建立一个正则表达式

  1. 直接量语法(字面量)

    var expression = /pattern/flags ;
    //pattern 是要婚配的字符串形式
    //flags用来标记正则表达式的行动: i 不辨别大小写;g 示意全局搜刮 ;m 示意多行形式
    var reg = /ab/i ,示意婚配 字符串 'ab' 不辨别大小写
  2. 挪用RegExp对象的组织函数

    //RegExp 是js中一个内置的对象,是正则表达式的缩写
    var expression = new RegExp(pattern,flags)
    //flags 和直接量语法一致
    //pattern 能够是字符串形式,也能够是一个规范的正则表达式,后者必需省略 flags
    //能够写成var reg = new RegExp('ab','i')  或许var reg = new RegExp(/ab/i)
    //不能写成 var reg = new RegExp(/ab/,'i')

ES5中划定:运用直接量必需像直接挪用RegExp组织函数一样,每次都建立一个新的RegExp实例,所以
上面2种体式格局建立正则表达式,除了历程不一样,效果是一样的。

RegExp每一个实例都有以下属性:

  1. global:布尔值,示意实例是不是设置了 g 标志

  2. ignoreCase:布尔值,示意是不是设置了 i 标志

  3. multiLine:布尔值,示意是不是设置了m 标志

  4. source:返回建立RegExp对象实例时指定的表达式纯文本字符串。不包括背面的标志

  5. lastIndex:整数,示意实例在接下来的一次搜刮婚配项的最先位置,默许从0最先

运用正则表达式的实例要领

RegExp.prototype.exec()

exec() 要领为指定的一段字符串实行搜刮婚配操纵,返回包括第一个婚配项的数组,regexObj.exec(str) ,没有婚配到则返回 null,返回的数组是Array的实例,而且返回值还包括别的2个属性:index: 婚配到的字符位于原始字符串的基于0的索引值input: 原始字符串`

var myRe = /ab*/g;
var str = 'abbcdefabh';
var oo = myRe.exec(str)
// oo ==> ["abb"] 
// oo.index ==> 0 
// myRe.lastIndex ==> 0
// 从返回效果能够看出来,纵然我们设置了全局的g,exec也不会一次性返回一切的婚配效果
// 由于其定义就是  返回包括`第一个婚配项`的数组,只需第一次婚配到,背面就不继续实行
// 我们再实行一次
oo = myRe.exec(str)
// oo ==> ["ab"] 
// oo.index ==> 3 
// myRe.lastIndex ==> 3
// 再次实行以后能够看到 婚配项和一些属性值都发作了变化,申明 此次并非从头最先

官方申明:当正则表达式运用 “g” 标志时,能够屡次实行 exec 要领来查找同一个字符串中的胜利婚配。当你如许做时,查找将从正则表达式的 lastIndex 属性指定的位置最先(也就是说下次的查询将在上次婚配胜利背面最先婚配,而且会轮回,在婚配不到的时刻,会从头最先)。(test() 也会更新 lastIndex 属性)。
不加”g” 标志的时刻,每次都是从 0 最先,所以种种属性也不会转变

exec() 要领另有一个主要的作用:婚配捕捉组

var str= "cat2,hat8" ;
var reg=/c(at)/ ;  
console.info(reg.exec(str));//运转返回   ["cat2", "at"]
加了捕捉组的时刻,效果会把捕捉组一同返回,不加则没有,支撑多个捕捉组

注重 IEjavascriptlastIndex 设想上存在误差,没加g的情况下也会每次发作转变,慎用

RegExp.prototype.test()
吸收一个字符串参数,regexObj.exec(str),婚配返回true,不然false

RegExp.prototype.toString() ( RegExp.prototype.toLocaleString())

RegExp 对象覆蓋了 Object 对象的 toString() 要领,并没有继续 Object.prototype.toString()。关于 RegExp 对象,toString 要领返回一个该正则表达式的字面量

myExp = new RegExp("a+b+c");
alert(myExp.toString());       // 显现 "/a+b+c/"

foo = new RegExp("bar", "g");
alert(foo.toString());         // 显现 "/bar/g"

正则表达式在 String 的运用

match
一个在字符串中实行查找婚配的String要领,它返回一个数组或许在未婚配到时返回null

var oo = '121212'.match(/1/g)
oo
//["1", "1", "1"]
var oo = '121212'.match(/1/)
oo
//["1"]

replace
一个在字符串中实行查找婚配的String要领,而且运用替代字符串替代掉婚配到的子字符串。

'121212'.replace(/1/g,',')
//",2,2,2"

split
一个运用正则表达式或许一个牢固字符串分开一个字符串,并将分开后的子字符串存储到数组中的String要领。

//以数字支解字符串
'a1b2c33d4'.split(/\d*/)
//["a", "b", "c", "d", ""]

search
一个在字符串中测试婚配的String要领,它返回婚配到的位置索引,或许在失利时返回-1。

//查找一连2个数字的位置
'a1b2c33d4'.search(/(\d){2}/)
// 5

小演习

把一串数字字符串千分位体式格局(逗号)转化成金额标记

剖析要点:

  1. 金额的千分位是从右往左,每3位加一个逗号,然则正则表达式内里从右往左不是很轻易,所以第一步要把数字倒置过来,字符串并没有直接的倒置要领,数组有,Array.prototype.reverse.call([1,2,3,4]) ==>[4, 3, 2, 1],字符串转数组也是很轻易的,String.prototype.split.call('1234','') ==> ["1", "2", "3", "4"]

  2. 再把倒置的数组拼接成字符串 Array.prototype.join.call([4,3,2,1],'')==> 4321

  3. 小数点背面的不需要处置惩罚,所以我们要猎取 String.prototype.split.call('12345.678','.')[1] ==> 12345 由于我们这里已反转了,所以真正要转化的数字在第二个

  4. 前面都是准备工作,如今需要用正则表达式处置惩罚字符串,婚配一连的3位数字支解成数组 \d{3} 示意一连3个数字 String.prototype.match.call(‘1234’,/\d{3}/) ==> ["123"],这里把背面的一名数字和2位数字直接疏忽了,而且没有全局婚配,所以我们要补充一下。

    String.prototype.match.call('1234567891',/\d{3}|\d{2}|\d{1}/g)
    //["123", "456", "789", "1"]
  1. 末了就把数组用逗号衔接,在用小数点和之前的小数位加在一同,再像第一步那样反转一下递次就能够了。

例子代码

function money_thousandth (str){
    //先搜检是不是是相符数字范例
    if(isNaN(str)){
        return '必需传入数字或许数字字符串'
    }
    str = str.toString();
    //反转递次并支解小数点
    var arr = str.split('').reverse().join('').split('.');
    //全局优先婚配一连的3位数字,或许2位,或许1位
    var reg = /\d{3}|\d{2}|\d{1}/g;
    //有小数点取第二位,没有则取第一名
    var thousand = arr[1] || arr[0] ;
    //支解数组 
    var result_arr =  thousand.match(reg);
    //逗号拼接支解好的金额
    var result_str = result_arr.join(",");
    //与小数点前面加起来
    var result = arr[1] ?   arr[0] + '.'+ result_str  : result_str
    //返回倒置的数字字符串
    return result.split('').reverse().join('')
}
money_thousandth(1234567898.12)
//"1,234,567,898.12"
money_thousandth('1234567898.12')
//"1,234,567,898.12"

点击检察正则表达式经常使用语法

    原文作者:谁谁
    原文地址: https://segmentfault.com/a/1190000007378270
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞