正则表达式

正则表达式

  • 转义字符
    ‘\’ 为转义字符
    \n 为 新行
    \r 行结束,换行
    \t 制表符 缩进
// 在innerHTML 里面换行会报错 ,需要有\转掉
document.body.innerHTML = "\
\ \ "
;

RegExp

  • 创建正则表达式
    1 正则表达式自变量
    判断有没有abc片段
    var reg = /abc/
    abcd : true
    var reg = /abe/
    abcd: false
    2 new RegExp()构造函数
    第一个参数写判断主题,第二个写判断出现的修饰符
    var reg = new RegExp(“abc”,“img”)
    也可以把以声明的正则表达式填里面
    var reg = /abce/m
    var reg1 =new RegExp(reg)
    不互相印象
    如果不用new 则使用同一个引用地址 会相互影响

  • i
    当在正则自变量后面出现 i 则忽视大小写
    var reg = /abce/i
    ABCEd : true

  • g
    全局匹配 查找所有,而不是查找到第一个后停止

var reg = /ab/
var str = ababa
str.match(reg) //['ab']
加上g
reg = /ab/g 
str.match(reg) // ['ab','ab']
  • m
    多行匹配
    当使用/n /s 会生效
var reg = /^a/g;
var str = "abcde\na"
str.match(reg) ['a']
var reg = /^a/gm;
str.match(reg) ['a','a']

表达式规则

  • []
    中括号里写的东西表示正则表达式可以取到的范围
    /[123456789] [123456789][123456789]/
    匹配连续的三个数,每个方括号只代表一个值
    string= 123agad712345asdfa
    匹配出 123 712
    /[ab][cd][d]/g
    str = abcd
    匹配出 bcd
    方括号里可以简写
    [0-9A-Za-z] [A-z] 按照asc码排序

  • ^
    当^放在表达式里,代表取反
    var reg = /[^a][^b]/g
    代表第一个不是a 第二个不是b
    var str = ab1cd
    匹配出 b1 cd

  • ()
    圆括号里可以加| 代表或
    /(abc|bcd)/
    abc,bcd都可以匹配
    /(abc|bcd)[0-9]/
    代表abc或者bcd后面跟一位数字

  • 子表达式
    子表达式也是() ,代表反向引用
    reg = /(\w)\1/g
    \1是匹配第一个子表达式里的内容
    str = “aaaa”
    reg = /(\w)\1\1\1/g 匹配成功 “aaaa”
    匹配 str = “aaabbb”
    reg = /(\w)\1\1(\w)\2\2/g 匹配成功 “aaabbb”

元字符

  • \w
    /w代表[0-9A-z_]
    数字字母下划线
    /W = [^\w] 数字字母下划线取反
    str = bcd2
    /\wcd2/g 可以匹配
    /\Wcd2/g 无法匹配

-\d
\d [0-9] 数字
\D[^0-9] 非数字
reg = /\d\d\d/
str = 123 可以匹配
str = 13 无法匹配

  • \s
    \s 空白字符
    \S 非空白字符
    换行符\n 制表符\t 回车\r 换页符\f 垂直制表符\v 加上空格

  • \b
    \d 单词边界
    \B 非单词边界
    reg = /\bce/g
    str = abc ced defg 匹配出ce

  • \t
    制表符
    reg = /\tc/g
    str = as tclj123 无法匹配
    str = as/tclidfsf可以匹配
    不是视觉上的制表符,而是内容/t /n同理

  • \uxxx
    匹配unicode编码
    /[\u000-\ufff] 匹配一切
    写一个方法包含一切
    [\s\S] [\d\D]

  • .
    [^\r\n] 匹配一切除了\r,\n

量词

  • +
    + 相当于{1, } 一到正无穷
    reg = /\w+/g
    str = “abc” 匹配成功 “abc”
    var reg = /\w*/g
    str = ‘aaaaaaaaaaaaa’ 匹配成功 ‘aaaaaaaaaaaaa’
    贪婪匹配原则,尽量匹配多

  • *
    * 相当于{0, } 零到正无穷
    reg = /\w*/g
    str = “abc” 匹配成功 “abc”,""
    abc匹配完因为光标定位,
    还有逻辑上的距离,*匹配空

reg - /\d*/g
str = abc 匹配成功 “”,"","",""

  • ?
    相当于{0-1}
    reg = /\w?/g
    str = ‘12345’ 匹配成功’1’,‘2’,‘3’,‘4’,‘5’,’’

  • {}
    填写一个数字{匹配个数}
    填写两数字{匹配的最小个数,匹配的最大个数}
    填写一个数字和, {1,} 1到正无穷

  • ^
    以···开头
    reg = /^abc/
    str = abcdefg 匹配成功 “abc”

  • $
    以···结尾
    reg = /cge$/
    str = abcge 匹配成功 “cge”
    reg = /^abc$/g
    str = abcabc 无法匹配 abc必须同时满足开头和结尾

正向预查
根据条件查询其他的字符

  • ?=n 匹配任何其后紧接指定字符串n的字符串
    var str = “abaaaaa”
    var reg = /a(?=b)/g 匹配成功 [“a”]
  • ?!n 匹配任何后面不是指定字符串的n的字符
    var reg = /a(?!b)/g 匹配成功 [“a”,“a”,“a”,“a”,“a”]

贪婪匹配
正常情况下都是贪婪匹配
非贪婪: 在量词后面加?
var str = “aaaaa”
var reg = /a+?/g 匹配结果: [“a”,“a”,“a”,“a”,“a”]
var reg = /a??/g 匹配结果: ["","","","",""]
var reg = /a*?/g 匹配结果: ["","","","",""]

正则表达式对象的属性
global 对象是否含有g
ignoreCase 对象是否含有i
mulitiline 对象是否含有m
lastIndex 表示开始下一次匹配的字符位置
source 整个这表达式的源文本

正则表达式方法
reg.exec()
var reg = /ab/g;
var str = “abababab”
reg.exec(str) 匹配成功 [“ab”]
返回一个类数组 有个游标 index
第一次index:0
第二次会接着第一次的游标 [“ab”] index:2
当最后返回null,然后从头再次匹配
游标index就是lastIndex的值
当正则不加G的话 游标不会动

当使用子表达式()时,会多两位数组位
匹配 str = “aaabbb”
reg = /(\w)\1\1(\w)\2\2/g 匹配成功 “aaabbb”
reg.exec(str) 返回类数组 [“aaabbb”,“a”,“b”]

reg.test() 检验是否符合要求
reg.compile()

面试题:

  • 写出一条正则判断首尾是否含有数字
    var reg = /^\d|\d$/g

如果是首尾都含有数字
var reg = /^\d[\s\S]*\d$/g

  • replace 替换重复的字符
    “aa”.replace(“a”,“b”) ==> “ba”

  • 把字符串倒过来
    str = “aabb”
    reg = /(\w)\1(\w)\2/g
    str.replace(reg,"$2$2$1$1")
    $可以引用子表达式
    可以用函数表示
    str.replace(reg,function($,$1,$2) {
    // 第一个参数代表字符串全局
    return $2+$2+$1+$1
    })
    如果想替换$ 需要$$

  • 把-链接改成小驼峰写法
    var str = thie-first-name
    str.replace(/-(\w)/g,function($,$1){
    return $1.toUpperCase()
    })

  • 字符串去重
    var str =“aaaabbbcccc”
    var reg = /(\w)\1*/g
    str.replace(reg,"$1")

  • 百度难题 把数字写成科学记数法
    var str = 1000000000
    var reg = /(?=(\B)(\d{3})+$)/g
    str.replace(reg,".")
    1 使用$从后往前查
    2 找3位数字
    3 用正向预查查找后面是三位数字
    4 不是单词边界

你可能感兴趣的:(爬坑记,js,正则表达式基础)