算法刷题系列,详解解题过程中遇到的知识点,解释过一遍的知识点不会重复解释。
解题思路
将字符串头尾空格去掉,然后将多个空格用正则替换成一个空格,根据空格分隔成数组,然后翻转转回字符串。
代码
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
return s.trim().replace(/\s+/g, ' ').split(' ').reverse().join(' ')
};
要点详解
1. 正则表达式
正则表达式是用于匹配字符串中组合的模式,使用一个正则表达式字面量,其由包含在斜杠内的模式组成。
let reg = /a+/
两种模式
- 简单模式
字面量由你想知道找到的字符构成,比如 /abc/
就能且仅能匹配 "abc"
。
- 特殊字符
当你需要匹配一个不确定的字符串时,比如匹配 1 个或者多个 "b"
或者寻找空格,就可以使用特殊字符,比如可以使用 /a+/ 来匹配 aaa
+ 表示一个或者多个。
特殊字符
- 断言,表示一个匹配在某些条件下发生。断言包含先行断言、后行断言和条件表达式。
/^a/
匹配以a
开头/$a/
表示以a
结尾/\ba/
匹配a
字符前没有另外一个字符位置。/\Ba/
匹配a
字符前有另外一个字符的位置。/a(?=b)/
,匹配后面跟随b
的a
/a(?!b)/
,匹配后面不跟随b
的a
/(?<=b)a/
向后断言,匹配前面b
开头的a
/(?<!b)a/
向后否定断言,匹配前面不以b
开头的a
- 字符类,区分不同类型的字符,例如区分字母和数字。
/\d/
匹配任何数字/\D/
匹配任何非数字/\w/
匹配任何字母数字/\W/
匹配任何非字母数字/\s/
匹配单个空白字符/\S/
匹配空格意外的单个字符/\t/
匹配水平制表符/\n/
匹配换行符/\v/
匹配垂直制表符/\f/
匹配换页符/[\b]/
匹配退格符/\0/
匹配一个 NUL 字符,不要在此后面加上另一个数字。
- 组和范围,表示表达式字符的分组和范围。
/a|b/
匹配"a"
或"b"
任意一个字符/[a-c]/
匹配任何一个包含的字符,可以用-
来指定字符范围。
- 量词,表示匹配的字符或表达式的数量。
/x*/
表示将x
匹配 0 次或者更多次。/x+/
表示将x
匹配 1 次或者更多次/x?/
表示将x
匹配 0 次或 1 次/x{n}/
表示将x
匹配 n 次/x{n, }/
表示至少匹配 n 次/x{n, m}/
表示匹配 n~m 次- 再以上符号后添加 ? 匹配非贪婪的字符串
2. trim()
string.trim() 去掉字符串头部和尾部的空格,并返回,且该方法不会改变原始字符串。
let a = ' 111 '
console.log(a.trim()); // '111'
3. replace()
string.replace(searchvalue,newvalue) 用一些字符,替换另一些字符,或替换与正则表达式匹配的子串,并返回,且该方法不会改变原始字符串。
// 用一些字符替换另一些字符
let a = 'abc'
console.log(a.replace('a', 'c')) // 'cbc'
// 替换与正则表达式匹配的字符
let a = 'abac'
console.log(a.replace(/[a]/g, b)) // 'bbbc'
4. split()
string.split(separator,limit)
把一个字符串分割成字符串数组并返回
参数
- separator,可选,字符串或者正则表达式,表示从该参数指定的地方分割,如果在 str 中省略或不出现分隔符,则返回的数组包含一个由整个字符串组成的元素。
- limit,可选,指定返回数组的最大长度。
let a = "1 2 3 4"
console.log(a.split(' ')); // ['1', '2', '3', '4']
console.log(a.split(/[1-2]/g) ) // ['', ' ', ' 3 4']
5. reverse()
array.reverse()
颠倒数组中元素的位置并返回,不改变原数组,
let a = [1,2,3,4]
console.log(a.reverse()) // [4, 3, 2, 1]
6. join()
array.join(separator)
用于把数组中的所有元素转换一个字符串
参数 separator,指定要使用的分隔符,如果省略该参数