正则表达式
正则表达式是构成搜索模式的字符序列。该搜索模式可用于文本搜索和文本替换操作。 正则表达式通过构建特定规则的模式,与输入的字符串信息比较,从而实现字符串的匹配、查找、替换及分割等操作。
建立两种方法
var reg = /abc/g
var reg1 = new RegExp("abc","g")
修饰符:
- i == ignore 大小写
- g == 全局匹配
- m == 多行匹配
特殊表达
- [] 表示区间
- /^a/ 以 a 开头
- /d$/ 以 d 结尾
- [^a] 非 a
原字符
- . === [^\r\n] 除了\r 和\n 的所有
- \w === [0-9A-z] 查找单词字符
- \W === [^\w] 查找非单词字符
- \d === [0-9] 查找数字
- \D ===[^\d] 查找非数字字符
- \s === [\t\n\r\v\f ]查找空白字符
- \S === [^\s]
- \b === 单词边界
- \B === 非单词边界
!空白字符包括:
空格
\n 换行
\f 换页
\r 回车
\t 制表符(mac book 上 tab 健)
\v 垂直制表
量词 能多就不要少的匹配原则,(贪心匹配)如果转化成能少就不要多(非贪心)加一个{}后加?
- n+ {1,} 匹配 1-正无穷
- n* {0,} 匹配 0-正无穷
- n? {0,1} 匹配 0-1 个
- n{X} {x} 匹配 x 个
- n{x,y} {x,y} y 个成对开始往 x 对
- n{x,} {x,} 匹配 x 到最多
reg正则常见方法
- reg.test()//返回 true false, str是否有符合reg的片段
- reg.exec() 它通过指定的模式(pattern)搜索字符串,并返回已找到的文本。如果未找到匹配,则返回 null。
- reg.lastIndex()每一次游标结束的位置就是下一次 lastIndex 开始的位置
!注意加 g 和不加 g 区别, 不加g lastIndex 返回的值都是0,游标不会走,每次都是从头开始
正向预查,正向断言
var str ="abaaaaa"
var str1 = /a(?=b)/g
var str2 = /a(?!b)/g
console.log(str.match(reg)) // ["a"] 只找到一个 a 后面有 b
consol.log(str.match(reg)) //["a","a","a","a","a"] a 后面非 b
小练习
var reg = /^a/g
var str = "abcde\na"
console.log(str.match(reg)) //["a","a"] 两个以 a 开头的行
!^a表示以a开头\n表示换行,有g 所以这里有两个满足的a
var reg = /[ab][cd][d]/g
var str = "abcd"
console.log(str.match(reg)) //["bcd"]
![] 表示一个区间,这里有三个区间,区间里的值可以选择以满足条件
var reg = /[0-9A-z]/ 包含 0-9 大小 26 字母
var reg =/(abc|bcd [0-9])/g
var str = "bcd2"
console.log(str.match(reg)) //["bcd2"]
!这里的|表示或者,“|” 符号旁边两个条件满足一个就行
var reg = /\bc/g
var str = "abc cde fgh"
console.log(str.match(reg)) //["abc","cde"]
!\bc 表示以c为单词边界
var reg = /\tc/g
var str = "abc\tcdefgh"
console.log(str.match(reg)) //["\tc"]
var reg = /\nc/g
var str = "abc\ncdefgh"
console.log(str.match(reg)) //["\nc"]
var str = "aaaa"---匹配四个重复
var reg = /(\w)\1\1\1/g
ex str = "aabb"----匹配两两重复
var reg = /(\w)\1(\w)\2/g
var reg = /ab/g
var str = "abababab"
console.log(reg.lastIndex(str)// 0
console.log(reg.exec(str)) //["ab", index: 0, input:"abababab"]
console.log(reg.lastIndex(str)// 2
console.log(reg.exec(str)) //["ab", index: 2, input:"abababab"]
!游标变化,index也变化
字符串常用的方法
- search() 检索与正则表达式相匹配的值 返回匹配的位置,没匹配到-1
- match() 找到一个或者多个正则表达式的匹配
- split() 将字符串分割成字符串数组
- replace() 替换与正则表达式匹配的字符串,有两个参数,正则表达式 和替换成的表达
var str = "aa"
var str1 = /a/
var str2 = /a/g
console.log(str.replace("a","b")) //"ba"
console.log(str1.replace("a","b")) //"ba"
console.log(str2.replace("a","b")) //"bb"
测试
- 将 aabb 变为 bbaa
var reg = /(\w)\1(\w)\2/g
var str = "aabb"
console.log(str.replace(reg,"$2$2$1$1"))
!-----$1 第一个子表达式内容
- 将 the-first-name 变成 theFirstName
var reg = /-(\w)/g
var str = "the-first-name"
console.log(str.replace(reg, function($,$1){
return $1.toUpperCase()
}))
- 题目写一个正则表达式,查看首尾是否含有数字?首或者尾部
var reg = /^\d |\d$/g
var str = "123avf"
console.log(str.test(reg)) //true
改一下题目
题目写一个正则表达式,查看首尾是否都含有数字
var reg = /^\d[\s\S]\*\d$/g
var str = "123avf9"
console.log(str.test(reg)) // true
- 题目 去重复
var str = "aaabbbccc"
var reg = /(\w)\1\*/g
console.log(str.replace(reg,"$1"))
5.转换格式
var str = "10000000000"
var reg = /(?=(\d{3})+$)/g
console.log(str.replace(reg,"."))
- 金钱格式化正则版本
function formatNumber(str) {
return str.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
}
console.log(formatNumber("123456789")) // 1,234,567,890
黑科技
(123456789).toLocaleString('en-US') // 1,234,567,890
- 将日期格式化
Date.prototype.format = function(fmt) {
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours(), //小时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt)) {
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
}
for(var k in o) {
if(new RegExp("("+ k +")").test(fmt)){
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
}
}
return fmt;
}
var time1 = new Date().format("yyyy-MM-dd hh:mm:ss");
console.log(time1);