0.简介
regular expression,规则表达式,是一种用来处理字符串的规则,巧妙的正则表达式可以节省很多判断代码.
1.组成
\ 转义字符 => 普通字符 <=> 特殊字符
. 点 => 代表除了\n 以外的任意字符(字符字符字符)
^ => 以哪个元字符开始
$ => 以哪个元字符作为结束
\n 任意一个换行符
\d 0-9之间的一个数字
\D 除了0-9之间的任意字符
\w 数字字母下划线中的任意一个字符
\W
\s 一个空白字符 空格 制表符 换页符等
\t 一个制表符 4个空格
\b 单词边界
x | y 或者
[xyz] => x | y | z
[^xy] => 除了 x | y 的任意字符
[a-z]
[^a-z]
(正则中的分组符号)
(?😃 => 只匹配不捕获
(?=) => 正向预查
(?!) => 负向预查
* => 0-多次
+ => 1-多次
? => 0 - 1次
{n} => 出现n次
{n,m} => 出现n-m次
/abc/ 匹配abc
- i ignoreCase
忽略单词大小写
- m multiLine
进行多行匹配
- g global
全局匹配
2.贪婪性
| let str = 'ab2020nb', |
| |
| reg = /\d+?/g |
| console.log(str.match(reg)) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
3.懒惰型
| /* |
| * 基于exec的捕获 |
| * 捕获到的结果是一个数组或者null |
| * 第一项:本次捕获到的内容 |
| * 其余项:对应小分组本次单独捕获的内容 |
| * 当前捕获内容在字符串中的索引 |
| * input:原始字符串 |
| * 每执行一次exec只能捕获到一个符合正则规则的字符串,默认情况下执行多次也只能匹配第一次捕获的结果 => 正则捕获的懒惰型 |
| * 懒惰产生的原因:每一次匹配的lastIndex值不变 只能通过全局修饰符才能改变这一特性 |
| * lastIndex : 当前正则匹配下一次匹配的起始索引位置 |
| * |
| * 设置全局匹配符g之后第一次匹配完成之后会自动修改lastIndex的值 |
| * 此时可以进行循环多次进行匹配 |
| * |
| */ |
| let str = 'nb13奥利给6666aaaa', |
| reg = /\d+/g |
| |
4.举例几个简单正则表达式
| |
| |
| |
| let tel = /^1\d{10}$/ |
| |
| let reg1 = /^2.3$/ |
| console.log(reg1.test('2.3')) |
| console.log(reg1.test('253')) |
| console.log(reg1.test('2@3')) |
| let reg2 = /^2\.3$/ |
| console.log(reg2.test('2.3')) |
| let reg3 = /^\\d$/ |
| console.log(reg3.test('\\d')) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| let num = /^[+-]?(\d|([1-9]\d+))(\.\d+)$/ |
| console.log(num.test('+0.1')) |
| |
| isNaA(parseFloat(num)) === true |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| let reg = /(.)?/ |
| reg.test('.') |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| let email = |
| /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-za-z0-9]+)*\.[A-Za-z0-9]+$/ |
| /* |
| *身份证 |
| *规则: |
| 1.一共18位 |
| 2.最后一位可能是X 代表10 |
| 前六位:省市县 |
| 最后四位: |
| 最后一位X或者数字 |
| 倒数第二位: 偶数女 奇数 男 |
| 其余两位经过算法算出 |
| |
| 小括号还具有:分组捕获功能,不仅可以把大正则匹配的信息捕获,还可以单独捕获到每个小组的内容 |
| * |
| */ |
| let id = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|X)$/ |
| console.log(id.exec('37152219900101823X')) |
5.以前学习的记录
| let time = '2020-11-6' |
| let reg = /^(\d{4})-(\d{1,2})-(\d{1,2})/g |
| time2 = time.replace(reg,'$1年$2月$3日') |
| console.log(time2) |
| |
| |
| |
| time1 = time.replace(reg,(...arg) => { |
| console.log(arg) |
| |
| |
| let [,$1,$2,$3] = arg |
| function padZero(str) { |
| return ('00' + str).slice(str.length) |
| } |
| $2 = padZero($3) |
| $3 = padZero($2) |
| return $1 + '年' + $2 + '月' + $3 |
| + '日' |
| }) |
| console.log(time1) |
| |
| |
| |
| let reg1 = /\b([a-zA-Z])[a-zA-Z]+\b/g |
| let str1 = 'good good study day day up!' |
| |
| str1 = str1.replace(reg1,(...arg) => { |
| |
| console.log(arg) |
| let [content,$1] = arg |
| $1 = $1.toUpperCase() |
| content = content.slice(1) |
| return $1 + content |
| }) |
| console.log(str1) |
| |
| |
| |
| |
| |
| |
| let str = 'aaabbbbbbbbccccbcccccd' |
| |
| function statastic(str) { |
| let obj = {}, |
| max = 1, |
| res = [] |
| ;[].forEach.call(str, char => { |
| if (typeof obj[char] !== 'undefined') { |
| obj[char]++ |
| return |
| } |
| obj[char] = 1 |
| }) |
| for (let key in obj) { |
| let item = obj[key] |
| item > max ? max = item : null |
| } |
| for (let key in obj) { |
| if (obj[key] === max) { |
| res.push(key) |
| } |
| } |
| |
| return `maxItem:${res}\nvalue:${max}` |
| } |
| console.log(statastic(str)) |
| |
| |
| |
| function statastic1(str) { |
| |
| str = str.split('').sort((a, b) => a.localeCompare(b)).join('') |
| |
| let reg = /([a-zA-Z])\1+/g |
| |
| let arr = str.match(reg) |
| |
| |
| arr.sort((a, b) => b.length - a.length) |
| console.log(arr) |
| let max = arr[0].length, |
| res = [arr[0].substr(0, 1)] |
| |
| for (let i = 1; i < arr.length; i++) { |
| let item = arr[i] |
| if (item.length < max) { |
| break |
| } |
| res.push(item.substr(0, 1)) |
| } |
| return `maxItem:${res}\nvalue:${max}` |
| } |
| console.log(statastic1(str)) |
| |
| function statastic3(str) { |
| |
| str = str.split('').sort((a, b) => a.localeCompare(b)).join('') |
| let max = 0, |
| res = [], |
| flag = false; |
| console.log(str) |
| for (let i = str.length; i > 0; i--) { |
| |
| let reg = new RegExp('([a-zA-Z])\\1{' + (i - 1) + '}', 'g') |
| str.replace(reg, (content, $1) => { |
| res.push($1) |
| max = i |
| flag = true |
| |
| }) |
| if (flag) { |
| break |
| } |
| } |
| return `maxItem:${res}\nvalue:${max}` |
| } |
| console.log(statastic3(str)) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function formatTime1(template) { |
| |
| let timeArr = this.match(/\d+/g) |
| template = template || "{0}年{1}月{2}日{3}时{4}分{5}秒" |
| template = template.replace(/\{(\d+)\}/g, (content, $1) => { |
| let time = timeArr[$1] || '00' |
| |
| function padZero(str) { |
| return ('00' + str).substr(str.length) |
| } |
| time = padZero(time) |
| return time |
| }) |
| return template |
| } |
| |
| function formatTime(template = "{0}年{1}月{2}日{3}时{4}分{5}秒") { |
| let timeArr = this.match(/\d+/g) |
| |
| return template.replace(/\{(\d+)\}/g, (...[,$1]) => { |
| let time = timeArr[$1] || '00' |
| return time.length < 2 ? '0' + time : time |
| }) |
| } |
| |
| |
| ['formatTime'].forEach(item => { |
| String.prototype[item] = eval(item) |
| }) |
| let time = '2020-11-17 09:0:00' |
| console.log(time.formatTime()) |
| console.log(time.formatTime('{3}时{4}分{5}秒')) |
| function queryParams(url) { |
| let obj = {} |
| let reg = /([^?=&#]+)=([^?=&#]+)/g |
| url.replace(reg, (...[, $1, $2]) => obj[$1] = $2) |
| url.replace(/#([^$=?]+)/, (...[, $1]) => obj.hash = $1) |
| return obj |
| } |
| console.log(queryParams('www.baidu.com?123=456&id=888#box')) |
| function millionmeter(num) { |
| num += '' |
| num = num.split('').reverse().join('') |
| for (let i = 3; i < num.length; i += 4) { |
| let preV = num.substring(0, i), |
| next = num.substring(i) |
| num = preV + ',' + next |
| } |
| return num.split('').reverse().join('') |
| } |
| let num = 1151781932 |
| console.log(millionmeter(num)) |
| |
| |
| function millionmeter1(num) { |
| num += '' |
| num = num.split('').reverse() |
| for (let i = 3; i < num.length; i += 4) { |
| num.splice(i,0,',') |
| } |
| |
| return num.reverse().join('') |
| } |
| |
| console.log(millionmeter1(num)) |
| |
| |
| |
| function millionmeter2(num) { |
| num += '' |
| let reg = /\d{1,3}(?=(\d{3})+$)/g |
| return num = num.replace(reg,content => content + ',') |
| |
| } |
| console.log(millionmeter2(num)) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?