JavaScript正则表达式

123 阅读1分钟

匹配规则

  1. \d 数字
  2. \D 除了数字
  3. + 一个或多个
  4. . 除换行符外的任何字符
  5. \. 点字符
  6. \ 转移
  7. ? 一个或多个
  8. \w 字母或数字 或者下划线
  9. \s 空白
  10. \S 除了空白
  11. ^ 限定起始边界
  12. $ 限定结束边界
  13. [] 是可以匹配
  14. i 模式修正符 不区分大小写
  15. g 模式修正符 全部匹配到
  16. {2,5} 长度 2 到 5之间
  17. \b单词边界 具体就是\w\W之间的位置

模糊匹配

  1. 横向模糊 可匹配的字符串的长度不是固定的 实现的方式: 使用量词 {m, n}
  2. 纵向匹配 在匹配某位字符时, 有多种可能;
  • `[abc]`,表示该字符是可以字符“a”、“b”、“c”中的任何一个
    
  • `/a[123]b/`可以匹配如下三种字符串:"a1b""a2b""a3b"
    

字符组 []

虽然叫字符组(字符类), 但是匹配的是一个字符
  1. 范围表示 [a-z] 匹配任意小写字母 [0-9]任意数字
  2. 排除字符组 反义字符组 [^abc] 除a, b, c之外的任意字符
  3. 常见简写
  • \d``[0-9]
  • \D [^0-9] 除数字外的任意字符
  • \w [0-9a-zA-Z_] 表示数字、大小写字母和下划线
  • \W [^0-9a-zA-Z_] 非单词字符
  • \s [ \t\v\n\r\f] 表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页符。记忆方式:s是space character的首字母。
  • \S [^ \t\v\n\r\f] 非空白符。
  • . [^\n\r\u2028\u2029]通配符,表示几乎任意字符。换行符、回车符、行分隔符和段分隔符除外
  • 要匹配任意字符怎么办?可以使用[\d\D][\w\W][\s\S][^]中任何的一个

量词

{m,n}

  1. 简写形式
  • {m,} 表示至少出现m次。
  • {m} 等价于{m,m},表示出现m次
  • ? 等价于{0,1} 0次或一次
  • + 等价于{1,},一次或多次
  • * 等价于{0,},0次或多次

贪婪匹配与惰性匹配

贪婪匹配 
会尽可能多的匹配
var regex = /\w{2,4}/g;
var string = "ab,abc,abcd,abcde"; 
console.log( string.match(regex) ); 
// => ["ab", "abc", "abcd", "abcd"]
惰性匹配 尽可能少地匹配
在量词后边加? 实现惰性匹配
var regex = /\w{2,4}?/g; 
var string = "ab,abc,abcd,abcde"; 
console.log( string.match(regex) ); 
// => ["ab", "ab", "ab", "cd", "ab", "cd"]
`{m,n}?`
`{m,}?`
`??`
`+?`
`*?`

做过的例题

let str = "12aaa"
/^\d/.test(str)  //true  是否以数字起始
/^\d$/.test(str)//false  是否以数字起始和结尾

str.match(/[a-z]{3,6}/) //["aaa"]       匹配a-z字符, 3-6位  

res =  /^[a-z0-9_]{4,16}$/.test(username)   长度为 416, 内容为数字, 字母 下划线

/^-?\d+(\.\d+)?$/.test(s)   是否是数字字符 包括了负浮点数情况

'names'.match(/[a-z]{2}/i)   取字符串的前两位字母

'Sam Harris'.match(/\b\w/g)  // ['S', 'H']
/^([01][0-9]|[2][0-3]):[0-5][0-9]$/.test("18:30") // true 匹配24小时制时间
/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/.test('2022-04-25') 匹配日期