正则表达式

2017-07-15  本文已影响0人  yuhuan121

正则表达式图形化工具

正则表达式的基本语法

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

创建(建议字面量方式)

var reg=/<%[^%>]%>/g;

最后的g代表全局
RegExp实例对象有五个属性:
g:global,全文搜索,默认是false,不添加的话搜索到第一个结果停止搜索
i:ingore case,忽略大小写,默认对大小写敏感
m:multiple lines,多行搜索,默认值是false
l: lastIndex,是当前表达式模式首次匹配内容中最后一个字符的下一个位置,每次正则表达式成功匹配时,lastIndex属性值都会随之改变
s:source,正则表达式的文本字符串

元字符

元字符:在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符

( [ { \ ^ $ | ) ? * + .

字符类

正则表达式一个字符(转义字符算一个字符)对应字符串一个字符

可以使用元字符[]来构建一个简单的类,所谓类是泛指符合某些特征的对象。我们可以使用表达式 [abc] 把字符a或b或c归为一类,表达式可以匹配这类的字符。

取反

元字符[]组合可以创建一个类,我们还可以使用元字符^创建反向类/负向类,反向类的意思是不属于XXX类的内容,表达式 [^abc] 表示不是字符a或b或c的内容

范围类

我们可以使用 x-y来连接两个字符表示从x到y的任意字符,这是个闭区间,也就是说包含x和y本身,这样匹配小写字母就很简单了

[a-z]

要是想匹配所有字母呢?在[]组成的类内部是可以连写的,我们还可以这样写 [a-zA-Z]

预定义类

正则表达式为我们提供了几个常用的预定义类来匹配常见的字符,进一步简化使用



例如希望匹配一个 ab+数字+任意字符 的字符串,就可以写成 ab\d.

边界匹配字符

\\手机号码匹配 以1开头 长度为10 以此为结尾
var reg = /^1\d{10}$/
'13301693108'.match(reg) //["13301693108"]
'1330169310822'.match(reg) //null
#匹配以hello作为右边界、左边界
'hello worhellod hello'.match(/\bhello\b/g) //["hello", "hello"] 

'hello wor-hello-d hello'.match(/\bhello\b/g)// ["hello", "hello", "hello"]
 //值得注意的是,中横线也会被认为是单词边界

量词

#匹配[a-z]后面跟(一个或0个)数字字符
'a1234567b45dgf78'.match(/[a-z]\d?/g) //["a1", "b4", "d", "g", "f7"]
#匹配[a-z]后面跟(一个或多个)数字字符
'a1234567b45dgf78'.match(/[a-z]\d+/g) //["a1234567", "b45", "f78"]
#匹配[a-z]后面跟(0个或多个)数字字符
'a1234567b45dgf78'.match(/[a-z]\d*/g)//["a1234567", "b45", "d", "g", "f78"]

贪婪模式与非贪婪模式

量词在默认下是尽可能多的匹配的,也就是大家常说的贪婪模式

'123456789'.match(/\d{3,5}/g); //["12345", "6789"]

既然有贪婪模式,那么肯定会有非贪婪模式,让正则表达式尽可能少的匹配,也就是说一旦成功匹配不再继续尝试,在量词后加上?即可

'123456789'.match(/\d{3,5}?/g); //["123", "456", "789"]

分组

有时候我们希望使用量词的时候匹配多个字符,而不是像上面例子只是匹配一个,比如希望匹配Byron出现20次的字符串,我们如果写成 Byron{20} 的话匹配的是Byro+n出现20次

怎么把Byron作为一个整体呢?使用()就可以达到此目的,我们称为分组

(Byron){20}

如果希望匹配Byron或Casper出现20次该怎么办呢?可以使用字符|达到或的功效

(Byron|Casper){20}

前瞻

(/good(?=Byron)/).exec('goodByron123'); //['good']
(/good(?=Byron)/).exec('goodCasper123'); //null
(/bad(?=Byron)/).exec('goodCasper123');//null

RegExp.prototype.test(str)

方法用于测试字符串参数str中是否存正则表达式模式,如果存在则返回true,否则返回false

#检测是否为手机号码
function isPhoneNumber(str){
  console.log((/^1\d{10}$/).test(str))
}

RegExp.prototype.exec(str)

方法用于正则表达式模式在字符串中运行查找,如果exec()找到了匹配的文本,则返回一个结果数组,否则返回 null

除了数组元素和length属性之外,exec()方法返回对象还包括两个属性。

1.index 属性声明的是匹配文本的第一个字符的位置
2.input 属性则存放的是被检索的字符串string

var str2 = 'hallo jirengu, hbllo world, hcllo ruoyu'
var reg = /h[a-z]llo/g
do{
  result = reg.exec(str2)
  console.log(result)
}while(result)

String.prototype.search(reg)

search() 方法用于检索与正则表达式相匹配的子字符串,不执行全局匹配,从字符串的开始进行检索,总是返回字符串的第一个匹配的位置

String.prototype.match(reg)

match()方法将检索字符串,以找到一个或多个与reg匹配的文本。
通过增加g可控制其采用全局调用或非全局调用

String.prototype.replace(reg, replaceStr)

'abcabcabc'.replace(/bc/g,'X'); //aXabcabc

String.prototype.replace(reg, function)

通过自定义函数,replace可以实现很多强大的功能,尤其是在复杂的字符串替换语句中经常使用

#希望把一个字符串中所有数字,都用小括号包起来
'2398rufdjg9w45hgiuerhg83ghvif'.replace(/\d+/g,function(r){
    return '('+r+')';
}); //"(2398)rufdjg(9)w(45)hgiuerhg(83)ghvif"
上一篇下一篇

猜你喜欢

热点阅读