【前端算法系列】正则表达式

*0或者多次(尽可能匹配多次)
+至少1次
?0或者1次
?:尽可能少的匹配,,+后的?表示非贪婪匹du配
\s匹配任意的空白符(包括空格,制表符(Tab),换行符,中文全角空格)
\S则是任意不是空白符的字符
\w匹配包括下划线的任何单词字符,等价于 [A-Z a-z 0-9_]
\W匹配任何非单词字符,等价于 [^A-Z a-z 0-9_]
""

^匹配开始时,$匹配结尾

() 是为了提取匹配的字符串
[] 是定义匹配的字符范围
{} 一般用来表示匹配的长度

  1. ()()\1\2的用法
    \1表示重复第一个圆括号匹配到的内容
    \2表示重复第二个圆括号匹配到的内容
/^([a-z])([a-z])\2\1$/.test('abba')  \1表示b \2表示a
/^(\w)(\w)\1\2$/.test('abab')   \1表示a \2表示b

什么是捕获组?其实就是正则表达式中被小括号括住的部分。() 圈住的内容,就是我们要捕获起来额外存储的东西
[]中的匹配符之间是“或”的关系。[-\+]表示-或+号中,因为+本身是一个特殊的正则匹配符,所以要用一个\来完成转义

match() 方法是一个在字符串中执行查找匹配的String方法,它返回一个数组,在未匹配到时会返回 null。

  • 如果正则表达式尾部有g标志,match()会返回与完整正则表达式匹配的所有结果,但不会返回捕获组(比如goups、index、input)
  • 这里没有使用g标志,match()就会返回第一个完整匹配(作为数组的第0项)及其相关的捕获组(作为数组的第1及第1+项)。

重复的子字符串

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

输入: “abab”
输出: True
解释: 可由子字符串 “ab” 重复两次构成

const repeatedSubstringPattern=(str)=>{
    var reg=/^(\w+)\1+$/
    return reg.test(str)
}

正则表达式匹配

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。

‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素

说明:

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。

写好规则,浏览器的正则引擎会帮你解析规则,这道题是让你去实现正则引擎的部分

// 有模式:.*、a*   无模式: cdef
const isMatch = (s, p) => {
    let isMatch = (s, p) => {
        // 边界情况,如果s和p都为空,说明处理结束了,返回true,否则返回false
        if (p.length <= 0) {
            return !s.length
        }
        // 判断p模式字符串的第一个字符和s字符串的第一个字符是不是匹配
        let match = false
        if (s.length > 0 && (p[0] === s[0] || p[0] === '.')) {
            match = true
        }
        // p有模式的
        if (p.length > 1 && p[1] === '*') {
            // 第一种情况:s*匹配0个字符
            // 第二种情况:s*匹配1个字符,递归下去,用来表示s*匹配多个s
            // isMatch(s, s*is*p*.)
            return isMatch(s, p.slice(2)) || (match && isMatch(s.slice(1), p))
        } else {
            return match && isMatch(s.slice(1), p.slice(1))
        }
    }
    return isMatch(s, p)
}
console.log(isMatch("mississippi", "mis*is*p*."))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值