正则表达式的应用

正则常用的方法:

1.test

正则去匹配字符串,如果匹配成功就返回真,匹配失败就返回假

写法:正则.test(字符串)

.search

正则去匹配字符串,如果匹配成功,就返回匹配成功的位置,如果匹配失败就返回-1

search的写法:字符串.search(正则)

3.match

正则去匹配字符串,如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null

match的写法:字符串.match(正则)

4.replace

正则去匹配字符串,匹配成功的字符去替换新的字符串

replace的写法:字符串.replace(正则,新的字符串)

四.正则表达式字符类

字符类:一组相似的元素(用[]表示[]的整体代表一个字符,()是分组和子项的意思)

1.任意字符

[abc]

如o[usb]t--obt、ost、out

2.范围

[a-z]、[0-9]

如id[0-9]--id0、id5

3.排除

[^a]

如o[^0-9]t--oat、o?t、o t

例子:过滤标签

过滤掉<>(如<div>、</div>、<h2 class="sfsdf">)

var re=/<[wW]+>/g;  //中括号里是或的关系,也就是字符或非字符都有了,包括了斜杠,引号等

另一种做法:    var re=/<[^>]+>/g;

五.正则表达式转义字符

.(点):任意字符       .:真正的点

s(S):空格(非空格)

d(D):数字(非数字)

w(W):字符(非字符)   字符包括字母、数字、下划线

数字:重复子项(1:重复的第一个子项,2:重复的第二个子项...)

题目1:把 on-index-text 通过正则的方法替换为onIndexText

思路:找到"-" 的下一个字母,然后把它转成大写

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

stringObject.replace(regexp/substr,replacement)
参数一:可以是字符串也可以是正则表达式
 参数二:可以是字符串,也可以是函数
function toChange(string) {
let reg = new RegExp('-.{1}','g') // .{1}表示在-后的第一个位置的字符 g 表示全局匹配
let result = string.replace(reg,function(word){
return word.substring(1,2).toUpperCase()
})
return result
}

题目2:把2018-5-6替换成2018.6.5
function toChange2(string) {
let reg= /(d+)(-)/g
let result = string.replace(reg,function ($0,$1,$2) { // $0为匹配的全部数组 $1为第一个()匹配的数据 $2()为第二个()匹配到的数据
return $1+'.'
})
return result
}
console.log(toChange2('2018-5-6')) // 2018.5.6

题目3:将数值用千位表示法表示 12345替换成12,345
什么是单词边界?指代的是词与单词分隔符(通常是空白字符)之间的位置,非单词边界就是没有与单词分隔符相邻的位置
hello world
第一个o和后面的空格之间就是单词边界,第二个o则没有与单词边界相连
o可以匹配第一个o,因为它相邻着一个单词边界
oB可以匹配第二个o,因为它没有相邻单词边界(隔了一个h)

前瞻:(?=)和(?!)

前瞻分为正向前瞻和反(负)向前瞻,正向前瞻(?=表达式)表示后面要有什么,反向前瞻(?!表达式)表示后面不能有什么。

前瞻分组会作为匹配校验,但不出现在匹配结果字符里面,而且不作为子匹配返回。

//将该num转化为字符串后,全局(/g)正向匹配,看是否符合断言(?=(?:d{3})+$)部分,直到匹配结束。即遇到 数字 + 该数字后面紧跟连续的三位数字(并且不管这连续的三位数字出现多少次),符合则在该数字(’$1’)后加入逗号,替换的时候忽略(?:)这连续的三位数.
function toThousands(num) {
return (num || 0).toString().replace(/(d)(?=(?:d{3})+$)/g, '$1,'); // B表示匹配非单词边界 ?=匹配一个位置 ?:为非捕获性分组
}
console.log(toThousands(12344566))

function toThousands(num) {
return (num || 0).toString().replace(/(B)(?=(d{3})+$)/g, ','
); // B表示匹配非单词边界 那么匹配到是2-3之间的位置,然后用','替换
console.log(toThousands(12344))

题目4:替换敏感词
function changeWord(string){
let reg = new RegExp("rrr|ggg",'g')

return string.replace(reg,`<span style="color:red">***</span>`
)
}
let string = document.getElementById('test')
console.log(string.innerHTML)
string.innerHTML = changeWord(string.innerHTML)

题目5:
找某个字符串中出现最多的字符和它一共出现多少次 
//找某个字符串中出现最多的字符和它一共出现多少次 
/*
先把字符串拆为数组,然后进行排序,然后再转为字符串
* */
function findMore(str) {
let arr=str.split("");
str=arr.sort().join("");
let value = '' // 存放出现最多的字符
let index = 0 //存放次数
let reg = /(w)1+/g // 1+ 表示出现一次以上
str.replace(reg,function ($0,$1) {//$0代表整体,$1代表第一个子项
if (index < $0.length) {
index = $0.length //$0:每一组重复的元素
value = $1
}
})
alert('出现最多的字符是'+value+',出现次数是'+index);

}
findMore('vbbbbhybbfhbbgbbb')

题目6 :去掉字符串的空格
// 去掉字符串的前后的空格
function trim(string) {
let reg = /^s|s$/g
return string.replace(reg,'')
}

题目7:向前声明和反向前声明

(?=) :前向声明

(?!):反前向声明

function forntTest(string) {
let reg = /a(?=b)/g
return string.replace(reg,'*')
}
console.log(forntTest('abacad')) // *bacad

function forntTest(string) {
let reg = /a(?!b)/g
return string.replace(reg,'*')
}
console.log(forntTest('abacad')) // ab*c*d

题目8: 匹配日期
function checkDates(str) {
return /(d{4})(-|/|.)(d{2}2(d{2}))/.test(str) // 2为前面匹配的第二分组
}
能匹配 2018-05-06 2018.05.06 2018/05/06

题目9:每个单词的首字母转成大写
// 每个单词的首字母转成大写
function titleize(str) {
let reg = /(w)/g
//return str.match(reg)
return str.replace(reg,function (word) {
return word.toUpperCase()
})
}

题目10
// 驼峰表示法
function changeShow(str) {
let reg = /(s).{1}/g
return str.replace(reg,function (word) {
console.log(word)
return word.toUpperCase()
})
}
console.log(changeShow('wo men de'))

题目11:

// 匹配成对标签
function checkSymbol(str) {
let reg = /<([^>]+)>[dD]*<(/1)>/g // [dD] 1反向引用前面第一个()
return reg.test(str)
}

题目12:
//非贪婪匹配
function noMore(str) {
let reg = /d{2,3}?/g // 量词后面? 表示非贪婪匹配
return str.match(reg)
}
console.log(noMore("1234,456,46,33")) // ["12", "34", "45", "46", "33"]

题目13:
//匹配时间
/*
* 共4位数字,第一位数字可以为[0-2]。

当第1位为2时,第2位可以为[0-3],其他情况时,第2位为[0-9]。

第3位数字为[0-5],第4位为[0-9]*/
function parttenTime(str) {
let reg = /([0-1][0-9]|[0-2][0-3]):([0-5])([0-9])/g
return str.match(reg)
}
console.log(parttenTime("09:40 02:10"))

题目14:
// 验证密码问题 密码长度6-12位,由数字、小写字符和大写字母组成,但必须至少包括2种字符。

function checkPWS(str) {
//let reg = /(?=.*[0-9])^[0-9a-zA-Z]{6,12}/g // 必须包含数字
//let reg = /(?=.*[0-9])(?=.*[a-z])^[0-9a-zA-Z]{6,12}/g // 必须同时包含数字和小些字母
//let reg = /(?=.*[0-9])(?=.*[A-Z])^[0-9a-zA-Z]{6,12}/g // 必须同时包含数字和大些字母
let reg = /((?=.*[0-9])(?=.*[A-Z])|(?=.*[0-9])(?=.*[a-z])|(?=.*[A-Z])(?=.*[a-z]))^[0-9a-zA-Z]{6,12}/g
return reg.test(str)
}
参考https://zhuanlan.zhihu.com/p/27355118


原文地址:https://www.cnblogs.com/liangshuang/p/9000182.html