字符串匹配类的问题,尝试正则
最近在看数据结构和算法,努力总结出道~
基础:创建正则
创建正则,两种方式:
/ab+c/gi
,适用于静态的正则表达式new RegExp("ab+c","gi")
,适用于动态的表达式
后面的gi
是可选标志,可不写,表示允许全局和不分大小写搜索等,
网络异常,图片无法展示
|
基础:JS 怎么用正则
JS 使用正则,无外乎调用方法,一个是正则对象的两个方法 exec
和 test
方法, 一个是字符串的 5 个方法match
、matchAll
、replace
、search
和 split
方法。
网络异常,图片无法展示
|
一般常用的估计就是exec
、test
、match
、replace
,注意是哪种对象的方法,确保调用准确。
- 看下字符串里有没有匹配的字符串,一般用
test
,返回true/false
,如/^hello/.test('hello world!')
返回true
- 看下字符串里匹配的字符串具体有哪些,一般用
match
,返回数组/null
,如'Maria has a sheep named Yan'.match(/[A-Z]/g)
,返回['M','Y']
- 看下字符串里匹配的字符串的详细信息,一般用
exec
,返回数组/null
,需要第一个的时候直接使用,但需要所有的详细信息的时候,需要循环。因为 exec 只返回一个匹配字符串的详细信息
function getMatch(str, reg) { let resArray = []; let res = reg.exec(str); while (res) { resArray.push(res); res = reg.exec(str); } return resArray } console.log(getMatch('table football, foosball',/foo*/g))
网络异常,图片无法展示
|
- 字符串里面的内容需要替换,一般用
replace
,返回新的字符串,但不改变原始字符串。replace第二个参数可以是回调函数,返回值就是替换的值,复杂的情况可以结合函数使用。
var str = 'Twas the night before Xmas...'; var newstr = str.replace(/xmas/i, 'Christmas'); // Twas the night before Christmas... console.log(newstr);
练习:搜索字符串
网络异常,图片无法展示
|
add其实就是存储操作,为了后期查找更快速,以字符串的长度为 key
,相同长度的字符串存在一个数组中,整体结构是个Map
。
search,没有点的时候,其实就是普通字符串的查找。
麻烦一点的地方是有点的时候,如果用非正则的法子,得判断点的位置,然后看看字符串。但是用正则的话,很方便,直接建立正则就好。
var WordDictionary = function() { this.words = {} }; /** * @param {string} word * @return {void} */ WordDictionary.prototype.addWord = function(word) { const len = word.length // 没有键的话,创建 this.words[len] || (this.words[len] = []) // 存储到对应的键里 this.words[len].push(word); }; /** * @param {string} word * @return {boolean} */ WordDictionary.prototype.search = function(word) { const len = word.length // 键对应的词表 const list = this.words[len] // 没有词表,直接false if(!list) return false const hasPoint = word.includes('.') // 没有点的话 就是看看有没有词 if(!hasPoint) return list.includes(word) // 建立正则 const reg = new RegExp(word) // 看看有么有匹配的词 return list.some(item=>reg.test(item)) };
练习:字符串转化成数字
网络异常,图片无法展示
|
定理:题目长,意味着题目简单,考验的是耐心~~
- 根据第一条,第一步,去掉前面的空格
- 根据第二条,第二步,判断有没有正负号,没有的话就是正的
- 根据第三条,第三步,遇到非数字或者结尾,停止捕获
- 根据第四条,第四步,将数字部分字符串转化为数字
- 根据第五条,第五步,转化的数字是不是过界了,最大最小是有界限的
如果用非正则的法子,前面三步需要挨个处理,但是正则的话,可以一次性处理。
var myAtoi = function (s) { // \s是空格,可有可无;+-任意一个可有可无;后面的数字必须有,主要捕获的就是符号加数字 const reg = /^\s{0,}([+-]{0,1}[0-9]{1,})/; // 这边捕获第一个就够了,用exec足够 const match = reg.exec(s); // 没有捕获到就是null,返回0 if (!match) return 0; // 捕获到的话,第二项是需要的数字字符串,减0是转化为数字类型 const number = match[1] - 0; const min = -Math.pow(2, 31); const max = Math.pow(2, 31) - 1; // 边界值处理 return number > max ? max : number < min ? min : number; };