js正则表达式怎么用-JS正则表达式使用指南
别老想着把正则当成教科书里的那套死背书。它就是个能让人脏手干活的工具,有时候就连像个拿着手术刀的狂人,能切得干干净利落净,也能把不该切的连当一样。 想匹配数字?正则最精通的就是数字找出。写起来挺好办,`/^d+$/`。
这玩意儿在浏览器管住台一敲,立马亮红灯要么绿色。
比如你要处理用户输入,输入 `-123abc`,正则 `/^d+$/` 直接回毛病,出于它连个负号都没有,`d+` 是死胡同。
要是加上一般/平平数字逻辑,`/d+/g`,就能捞出一堆数字,哪怕里面有字母混着,它也会全吐出来。再比如手机号,`/^1[3-9]d{9}$/`,这一套代码一跑,非要是 `13800000000` 这种格式,其他乱七八糟的字符串全被过滤掉了,连个富余的字符都留不住。 字符匹配那时候就得略微有点脑子。
一般/平平字符 `.` 啥意思都没(在 JS 里就是任意单字符),`+` 是通配符,相当于 `a..` 都能匹配。但正则最烦的就是最直接的通配符,它忒能造孽,用了赶明儿代码满天飞。`/abc/g` 在正则里就是指 `a`、`b`、`c` 各一次,用的时候得写成 `/w+/g` 要么 `/[a-z]+/g`。
有时候为了省事,直接用 `/[a-z]+/g` 就能搞定所有小写字母。再比如匹配单词,`[0-9]+` 只能抓数字,要是遇到 `abc123`,它只会抓出 `123`,剩下的字母全不管。
这时候得用 `[0-9a-z]+`,一拆开,`abc123` 就乖乖被吞了。 有时候正则就是拿来吓唬人的。`(?i)` 是个魔术帽,把大小写都抹了,敏感、不敏感无所谓,全当是小写处理。用这个正则匹配 `HelloWorld`,结局全是 `hello`。
要么用 `(?x)`,这玩意儿主打一个“格式化输出”,一行正则能用四行意思解释清楚。
比如写一个邮箱,`/^[^s]+@[^s]+.[^s]+$/` 这一堆字符,靠 `(?x)` 能把每个局部强行换行,读起来像散文诗,逻辑别看乱,但显然比一行字好认多了。
不过别真信了这种“把一行变成四行”的魔法,有时候改错别字比改正则更头疼。
还有几个尤实际上用的模式,务必得提一提。`/./g` 是个坑,在国内开发者圈子里大家都懂,它的意思是“匹配任意单字符”,但在代码注释里写 `var text = `
比如单行匹配,`/^[^\n]$/`,意思是“从一个字符串头到尾,除了换行符,啥都能当”,这样用 `\n` 表示换行符,代码里就不会出幺蛾子。 分组也是正则的魔法的核心。`(...)` 能把内容包起来,撇脱后面单独拎出来用。`(?:...)` 比较专业,就是“非贪婪”的组,它是为了配合 `+` 和 `` 出现的。
比如你要匹配包含 `http` 的字符串,`/http(gender)?/i` 就能匹配 `http` 要么 `https`。再比如匹配年份,`(20d{2})` 能匹配 `2000` 到 `2099` 任意年份,比写 `(?
有时候为了匹配复杂模式,还得用 `|` 做逻辑分支。
比如 `apple|banana`,这俩词都能被匹配上。
要是非要区分大小写,能够用 `(?i)` 后面跟 `/case-insensitive|case-sensitive`,要么直接用正则转码的逻辑,比如 `str.normalize("NFD").replace(/[u0300-u036f]/g, "")`,把带重音的字母去掉再转大写,最终再判断是不是要匹配 `apple`,`Apple`,`APPLE` 都能对上号。 还有一种用法是 `grep`,别看它长得像个命令行工具,但本质也是正则。在某些命令行环境下,直接输入 `/pattern/g` 就能在文件里搜索并替换。
比如搜索 `http://`,然后替换成 `https://`,一行代码搞定。
不过要注意,`grep` 的 `g` 参数意味着“全局搜索”,要是不加 `g`,只能搜一次。
有时候正则匹配完发现不对,别急着改正则,先看看是不是匹配错了。
要是是匹配错了,可能逻辑忒复杂,得拆解成小块,一块块试。
比如匹配用户注册名,`/^[a-zA-Z0-9_-]{3,15}$/`,这忒长了,拆成 `[^\s]+` 开头,`[a-zA-Z0-9_-]{3}`,中间,`[a-zA-Z0-9_-]{15}` 结尾,逻辑更清楚。 再说说性能难题。正则表达式处理大数据时,效率确实不高。
每次匹配都要跑多次测试,哪怕只是几毫秒,积累起来也是大难题。
这时候能够寻思用 `RegExp.exec` 要么 `match` 方式,分别获取数组和字符串,性能上略微好一点,但别指望它能瞬间解决海量数据处理。
要是是纯文本处理,`string.match(pattern)` 往往比 `string.search(pattern)` 快不少。
要是要频繁用,写点缓存逻辑,把常用的正则模板存起来,动态生成,比每次重新编译快多了。 最终说点容错的事。正则表达式最怕的就是输入数据质量差。乱字符、空格、换行、怪的符号,都会让它崩溃。
比如匹配邮箱,正则里要是写了 `/d+@[dw]+.d+/`,遇到 `你好@domain.com`,正则就会困惑,出于 `你好` 里的中文实际上不是字符,它在某些环境下可能被解析成数字范围冲突。
这时候得加个逻辑判断:正则匹配成功,但内容里居然带了中文字符,那说明数据本身有难题,直接回空要么提示毛病,别强行再跑一次正则了。正则做数据清洗,目标是清理,不是当翻译官去意译。 总而言之,正则就是个实用主义者,它不整那些虚的,只看结局,看能不能通过。写正则的时候,先别管语法完美不完美,先看看能不能解决难题。数据乱了?加个逻辑判断,把脏数据过滤掉,正则就好了。逻辑忒复杂?拆分模块,一个个试。性能不中?缓存一下,别每次都重写。
记住,正则写得好是神器,写坏了就是定时炸弹,有时候还得手动手动点一次 `Ctrl+Z` 退出来。
声明:演示网站所有内容,若无特殊说明或标注,均来源于网络转载,仅供学习交流使用,禁止商用。若本站侵犯了你的权益,可联系本站删除。
