正则表达式 —— 说实话,看这一篇就够了(用详实的例子帮你快速掌握正则)

本博客使用的语言为 JavaScirpt

1. 正则表达式 (Regular Expression)

1.1 作用

1. 验证字符串是否符合规则

2. 从字符串中获取一部分符合规则的内容

1.2 语法

  • 使用特定字符组成一个表达式
  • 用这个表达式验证字符串,或从字符串中截取内容

1.3 创建方法

  1. 字面量创建:let reg = /abcd/;
  2. 构造函数创建:let reg = new RegExp('abcd');

作用:校验字符串中是否包含字串“abcd”

1.3.1 元字符

组成正则表达式的基本符号

普通元字符
\s表示一个空格
\S表示一个非空格
\t表示一个制表符
\d表示一个数字
\D表示一个非数字
\w表示一个数字、字母、下划线必有其一
\W表示有除数字、字母、下划线外的其它字符
.表示有非换行的任意字符
\转义符
边界元字符
^表示字符串的开始
$表示字符串的结束
限定元字符写在普通元字符或字母符号的后面,限制一个符号出现的次数
*表示出现 0 ~ 多 次
+表示出现 1 ~ 多 次
表示出现 0 ~ 1 次
{n}表示出现 n 次
{n,}表示出现 n ~ 多 次
{n,m}表示出现 n ~ m 次
`*?` `+?` `??` `{n}?` `{n,}?` `{n,m}?`这六个为非贪婪匹配

1.3.2 简单举例

    // 字符串中必须有一个空格
    let reg = /\s/
    console.log(reg.test("123"), reg.test("1 23"))
    // 字符串中必须有一个非空格
    reg = /\S/
    console.log(reg.test("    "), reg.test("1   "))
    // 字符串中必须有一个数字
    reg = /\d/
    console.log(reg.test("abcdefg"), reg.test("abc1defg"))
    // 字符串中必须有一个非数字
    reg = /\D/
    console.log(reg.test("abcdefg"), reg.test("abc1defg"))
    // 字符串中数字、字母、下划线必有其一
    reg = /\w/
    console.log(reg.test("abcdefg"), reg.test("abc1defg"))
    
    /**
     * 边界元字符
     */
    // 字符串必须以一个一个数字开头
    reg = /^\d/;
    console.log(reg.test("1hganijg"), reg.test("gjaoigh2bhes"))
    // 字符串只能有一个数字
    reg = /^\d$/;
    console.log(reg.test("a"), reg.test("2"))
    // 字符串有两个数字组成
    reg = /^\d\d$/;
    console.log(reg.test("55"))
    
    /**
     * 限定元字符
     */
    // 字符串中出现 0 ~ 多个数字组成的片段
    reg = /\d*/;
    console.log(reg.test("goan2156156faga"), reg.test("1516"), reg.test("ga15gasrg1515gs1515"), reg.test("gsg"))
    // 字符串只能由数字(个数:0 ~ )组成
    reg = /^\d*$/;
    console.log(reg.test("goan2156156faga"), reg.test("1516"), reg.test("ga15gasrg1515gs1515"), reg.test("gsg"))
    // 字符串只能由3个数字组成
    reg = /^\d{3}$/;
    console.log(reg.test(""), reg.test("0"), reg.test("12"), reg.test("123"), reg.test("11234"))

1.4 方法

1.4.1 RegExp对象.test(待检测字符串)

返回值:true、false

1.4.2 RegExp对象.exec(待截取字符串)

返回值:

  • 没有截取到片段 => null
  • 截取到片段
    返回一个数组
    • 索引 0 是截取到的片段(只截取符合条件的第一个子串)

1.5 小应用

1.5.1 捕获一段 html 结构的字符串

    let str = '<div style="" class=""><span></span></div>'
    let reg = /<.+>/;
    console.log(reg.exec(str)) // 截取到的字符为:<div style="" class=""><span></span></div>
    
    reg = /<.+?>/;
    console.log(reg.exec(str)) // 截取到的字符为:<div style="" class="">
    
    str = '<div style="" class=""><span></span></div'
    reg = /<.+>/;
    console.log(reg.exec(str)) // 截取到的字符为:<div style="" class=""><span></span>

1.5.2

    // 字符串必须以abc开头、2~多个d结尾
    let reg = /^abcd{2}$/;
    console.log(reg.test("abcddsa"), reg.test("abcddd"))

1.6 特殊的元字符

1.6.1 特殊的元字符

()将()中的内容作为一个整体
单独截取
(?:)整体匹配但不截取
|占位或
表示左边与右边都行,分为两个整体
[]一个 [] 占一个字符位置
表示里面的任意一个都行
[^]一个 [^] 占一个字符位置
表示非里面的任意一个都行
-使用在 [] 里面的一个符号
表示至或到,从哪一个字符到哪一个字符,要求字符在 ASCII 表中连续

1.6.2 举例

    // ()
    let reg = /abcd{2}/;
    console.log(reg.test("abcdd"))
    reg = /(abcd){2}/;
    console.log(reg.test("abcdabcd"))
    
    reg = /\d+(\s+)\d+/;
    console.log(reg.exec("123   123"))
    reg = /(\d+(\s+))\d+/;
    console.log(reg.exec("123   123"))
    
    // (?:)
    reg = /\d+(?:\s+\d+)/;
    console.log(reg.exec("123   123"))
    reg = /\d+(?:\s+\d+){2}/;
    console.log(reg.exec("123   123   123"))
    
    // |
    reg = /(abc|def)/;
    console.log(reg.test("abc"), reg.test("def"), reg.test("a"))
    
    reg = /^abc|def$/;
    console.log(reg.test('abc'), reg.test('def'), reg.test('abcdef'))
    
    reg = /^ab(c|d)ef$/;
    console.log(reg.test('abc'), reg.test('def'), reg.test('abcdefg'), reg.test('aaaadef'), reg.test('abcef'))
    
    /**
     * []
     */
    // 字符串中包含 a 或 b 或 c 或 d 
    reg = /[abcd]/
    console.log(reg.test('moimomamomoi'))
    // 字符串为:a 或 b 或 c 或 d 
    reg = /^[abcd]$/
    console.log(reg.test('moimomamomoi'))
    
    /**
     * [^]
     */
    // 字符串由一个字符组成,但不是 a 或 b 或 c 或 d 
    reg = /^[^abcd]$/
    
    /**
     * -
     */
    // 字符串由一个字符组成,0 ~ 9 的任一个数字
    reg = /^[0-9]$/

1.6.3 小练习

    /**
     * ()表示一个整体,这个整体是 abc 或 def
     * {2} 表示这个整体出现两次,只要两个整体就行
     */
    let reg = /!(abc|def){2}$/
    console.log(reg.test("abcabc"), reg.test("defdef"), reg.test("abcdef"), reg.test("defabc")) // 都是 true

    /**
     * 验证一个字符串:它只能与数字、字母、下划线组成,6~12 位,不能以 _ 开头
     */
    let reg = /^[^_]\w{5,11}$/

1.6.4 特殊元字符表示普通元字符

[0-9a-zA-Z_]\w
[^0-9a-zA-Z_]\W
[0-9]\d
[^0-9]\D
[ ]\s
[^ ]\S
[.]仅表示一个点字符

1.6.5 重复的元字符 —— \num

/num (num 表示一个正整数)

  • num 是一个数字,表示的是正则表达式中第 num 个可被捕获的 ()
  • 这个可捕获的小括号位置是什么,\num 处出现一份一模一样的内容
1.6.5.1 举例
let reg = /^(abc|def)\d+\1$/
console.log(reg.test("abc123abc"), reg.test('abc123def')) // true false

reg = /^([abcd])\d+([abcd])\d+\1\2$/
console.log(reg.test('a123b123ab')) // true

reg = /^(?:[abcd])\d+([abcd])\d+\1$/
console.log(reg.test('a123b123a'), reg.test('a123b123b')) // false true

1.7 正则标识符

标识符写在正则表达式的外面,修师整个标识符

1.7.1 标识符

i忽略全局大小写
g全局标识符
匹配和捕获的时候,都是只能找到第一个
当他有全局标识符的时候,你捕获第二次会从第一次的结束位开始查找
直到找不到了,返回null
再后面依次的时候,又回到[e]位置开始捕获
匹配和捕获都是影响下一次开始位的
y粘性全局标识符
每一次捕获的时候
第一次必须是从[0]位置就刚好能捕获到内容
第二次必须是从第一次结束位开始就刚好能捕获到内容才可以

1.7.2 使用

  1. /abcd/igy
  2. new RegExp('abcd', 'igy')

1.7.3 简单举例

let reg = /^[abcd]*$/
console.log(reg.test('abdcdA'))

reg = /^[abcd]*$/i
console.log(reg.test('abdcdA'))

let str = 'abc123abc456abc789abc'
reg = /\d{3}/g
console.Log(reg.exec(str))//结束位是[5]
consoLe.Log(reg.exec(str))//开始位就是[6]
consoLe.Log(reg.test(str))//开始位就是[12]
consoLe.Log(reg.exec(str))//开始位就是[15]
consoLe.Log(reg.exec(str))//开始位就是[o]

str = '123456abc789abc'
reg = /\d{3}/y
// console.Log(reg.exec(str)) l/ g 123
// consoLe.Log(reg.exec(str)) l/ g 456
console.log(reg.exec(str) // 123
console.log(reg.exec(str)) // 456
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值