关于正则表达式的一些整理

313 阅读1分钟

正则表达式

正则表达式是构成搜索模式的字符序列。该搜索模式可用于文本搜索和文本替换操作。 正则表达式通过构建特定规则的模式,与输入的字符串信息比较,从而实现字符串的匹配、查找、替换及分割等操作。

建立两种方法

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"

测试

  1. 将 aabb 变为 bbaa
var reg = /(\w)\1(\w)\2/g
var str = "aabb"
console.log(str.replace(reg,"$2$2$1$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()
}))
  1. 题目写一个正则表达式,查看首尾是否含有数字?首或者尾部
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
  1. 题目 去重复
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,"."))
  1. 金钱格式化正则版本
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 
  1. 将日期格式化
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);