* | 0或者多次(尽可能匹配多次) |
+ | 至少1次 |
? | 0或者1次 ?:尽可能少的匹配,,+后的?表示非贪婪匹du配 |
\s | 匹配任意的空白符(包括空格,制表符(Tab),换行符,中文全角空格) |
\S | 则是任意不是空白符的字符 |
\w | 匹配包括下划线的任何单词字符,等价于 [A-Z a-z 0-9_] |
\W | 匹配任何非单词字符,等价于 [^A-Z a-z 0-9_] |
" | " |
^匹配开始时,$匹配结尾
() 是为了提取匹配的字符串
[] 是定义匹配的字符范围
{} 一般用来表示匹配的长度
- ()()\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*."))