教你一招吃通javascript正则表达式

本篇文章给大家详细介绍一下吃通javascript正则表达式的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

教你一招吃通javascript正则表达式

正则表达式的作用

简单来讲正则表达式的作用就是进行字符串的增删改查,虽然javascritpt语言已经有及其完善的操作字符串的api,但是正则表达式会让你操作字符串更简单方便

创建正则表达式的方式

字面量形式

需要注意的是 字面量形式的正则表达式 是没有办法操作变量的,如下

const reg = "sattre is smart"let x = 's'console.log(/x/.test(reg)); //false

登录后复制

除非改成这样

立即学习“Java免费学习笔记(深入)”;

// eval是把字符串变成js表达式console.log(eval(`/${x}/`).test(str));

登录后复制

使用对象的形式创建正则表达式

使用对象的形式创建的好处就是能够直接接受正则变量

const x = 'a'let regs = new RegExp(x) let str = 'All we need is love'let reg = new RegExp('A', 'g') // 第二个参数代表匹配的模式console.log(reg.test(str));

登录后复制

小案例-实现输入字符高亮

其实就是和浏览器的ctrl+f功能差不多

nbsp;html>        Document  

    All we need is love  

const cin = prompt('输入想要高亮内容') const reg = new RegExp(cin, 'g') let mainp = document.querySelector('#main') console.log(mainp); mainp.innerHTML = mainp.innerHTML.replace(reg, matched => { return `${matched}` })

登录后复制

选择符

‘ | ’ 此为选择符,选择符两边的字符都可以匹配,都有效

let str1 = 'a'let str2 = 'b'console.log(/a|b/.test(str1)); //trueconsole.log(/a|b/.test(str2)); //true

登录后复制

对转义的理解

自己的话理解就是,有些特殊符号如:{} [] . 等本来在正则表达式中就已经赋予了它的含义,如果单独使用会按照本身赋予的含义编译,如果需要匹配这些特殊符号本身,那么需要在这些符号前面加上一个 ‘’ 来加以区别

小数点本身的正则含义是除换行符外的任何字符

// 匹配小数点 .let price = 23.34console.log(/d+.d+/.test(23.34)); //true

登录后复制

但是需要注意的来了

如果你是用对象方法声明的正则表达式的话,你需要在转义字符前多使用一次 ’ / ’ ,因为对象声明正则表达式传入的是字符串,他的解析方式不同

如下

let reg = new RegExp('d+.d+')console.log(reg.test(price)); //false

登录后复制

console.log('/d+.d+/');

登录后复制

在这里插入图片描述
需要改成:

let reg1 = new RegExp('\d+\.\d+')console.log(reg1.test(price)); //true

登录后复制

再来一个

const url = 'https://space.bilibili.com/17819768/' console.log(/https?://w+.w+.w+/d+//.test(url)); //true

登录后复制

字符边界约束

^ : 限定以其后面的第一个字符为开始$: 限定以其前面的第一个字符为结束

写一个监测必须以数字开头结束的字符串

let str = '2dasdjifeiorepo'let str2 = '3dsf5'console.log(/^dw+d$/.test(str));console.log(/^dw+d$/.test(str2));

登录后复制

注意:^ 如果用在[ ] 中 还有除了[ ] 中的字符以外都可以匹配的意思

let str = `张三:155565666523,李四:2564154156561`console.log(str.match(/[^d,:]+/g));

登录后复制

注意 :这里如果没有 ^ $ 的话 任意的超过6个的字符串都会成功,因为没有开始和结束的限定,match会在字符串中任意取6个字符,所以也算作是成功的

nbsp;html>        Document          let input = document.querySelector("[name='user']")    let span = document.querySelector('span')    console.log(input);    input.addEventListener('keyup', function () {      // console.log(this.value.match(/^w{3,6}$/));      if (this.value.match(/^w{3,6}$/)) {        span.innerHTML = '正确格式'      }else{        span.innerHTML = '请输入3-6位字符'      }    })  

登录后复制

元字符

元字符 匹配

d匹配数字D匹配除了数字的其他字符s匹配空白(换行符也算)S除了空白的其他字符w匹配字母 数字 下划线W除了字母数字下划线.匹配除了换行符的任意字符

匹配一个邮箱

let str = `#$%483023989@qq.com`let str2 = `483023989@qq.com`console.log(str.match(/^w+@w+.w+$/));console.log(str2.match(/^w+@w+.w+$/));

登录后复制

在这里插入图片描述

用 [ ] 巧妙匹配所有字符

如下,如果不加[ ] 代表完整匹配abc ,加了 [ ] ,代表可以匹配abc中的任意一个字符

let str = 'aaaabsdsc'console.log(str.match(/[abc]/g));console.log(str.match(/abc/g));

登录后复制

在这里插入图片描述
可以用 [sS] [dD] 匹配所有字符

let str = '$%^&*()(*&^&*(sfhsdjf   asdoia ..fdsdgf nsefxg][iogjpsf'console.log(str.length);console.log(str.match(/[sS]/g));

登录后复制

在这里插入图片描述

模式符

i : 不区分大小写g: 全局匹配

let str = 'Www'console.log(str.match(/w/gi)); //["W", "w", "w"]

登录后复制

多行匹配

 // 多行匹配 let str = ` #1 js,200元 #    #2 vue,500元 #    #3 angular,199元 # song   #4 node.js,188元 #   `let res = str.match(/s*#d+s+.+s+#s+$/gm).map(item => {  item = item.replace(/s*#d+s*/, '').replace(/#/, '')  let [name, price] = item.split(",")  return { name, price }})console.log(res);

登录后复制

字符属性

p 后面加上{x} x代表要匹配的字符属性 具体意思如下

元字符 含义

p{L} 所有字母p{N} 所有数字,类似于 d[p{N}p{L}] 所有数字和所有字母,类似于 wP{L} 不是字母,等价于 [^p{L}]P{N} 不是数字,等价于 [^p{N}]

let str = "sadhusafsafha.啥事爱上撒大声地?!"// 匹配字符console.log(str.match(/p{L}/gu));// 匹配标点符号console.log(str.match(/p{P}/gu));// 匹配汉字console.log(str.match(/p{sc=Han}/gu));

登录后复制

在这里插入图片描述

模式符 u
此修饰符标识能够正确处理大于uFFFF的Unicode字符。
也就是说,会正确处理四个字节的UTF-16编码。
此修饰符是ES2015新增,更多正则表达式新特性可以参阅ES2015 正则表达式新增特性一章节。

比如有些时候,一些宽字节的字符匹配不到,就需要用到模式符/u

lastIndex属性

let str = 'nihaowoshizhongguoren'let reg = /w/gconsole.log(reg.lastIndex);console.log(reg.exec(str));console.log(reg.lastIndex);console.log(reg.exec(str));while ((res = reg.exec(str))) {  console.log(res);}

登录后复制

在这里插入图片描述

有效率的y模式

和g的区别就是,g模式只要还有满足条件的字符就会继续下去匹配,而y模式只要下一个字符不满足匹配条件,就会停止匹配。它的作用是让匹配更具有效率,一旦遇到条件不符合的就不会再检测后面的字符了

let str = '尼采的电话是:516515614,111111111,2222222222 没重要的事千万不要打给他,因为他已经疯了'let reg = /(d+),?/yreg.lastIndex = 7console.log(reg.exec(str));console.log(reg.exec(str));console.log(reg.exec(str));console.log(reg.exec(str));

登录后复制

在这里插入图片描述

原子表和原子组的基本使用

[] 代表原子表:可选择匹配 ()代表原子组

let str = 'paul_sattre'console.log(str.match(/st/g)); //需要st一起才能匹配console.log(str.match(/[st]/g)); //需要只要有s 或者 t 就可以匹配

登录后复制

let date1 = '2021/4/9'let date2 = '2021-4-9'console.log(date1.match(/d+[-/]d+[-/]d+/));console.log(date2.match(/d+[-/]d+[-/]d+/));

登录后复制

在这里插入图片描述
其实上面还是有点缺陷
就是将date改成这样的时候 2021-4/9 前后两个符号不一致的时候还是能够匹配到,这个时候就可以用到原子组了

let date1 = '2021/4/9'let date2 = '2021-4-9'let date3 = '2021-4/9'console.log(date1.match(/d+([-/])d+d+/));console.log(date2.match(/d+([-/])d+d+/));console.log(date3.match(/d+([-/])d+d+/));

登录后复制

在这里插入图片描述
加了一个 () 后面的代表要和前面的()相同才能行

邮箱验证

// 邮箱验证let str = '483023989@qq.com.cn'let reg = /^[w]+@[w]+(.[w]+)+///["483023989@qq.com.cn", ".cn", index: 0, input: "483023989@qq.com.cn", groups: undefined]console.log(str.match(reg));// (.[w]+)+  表示括号之内的内容有1个或多个

登录后复制

在这里插入图片描述

原子组的替换操作

替换h标签为p标签

let str = `  

hello

  

asdas

  

dasdad

`let reg = /([sS]+)/gi// console.log(str.replace(reg, '

$2

'));/** *     

hello

  

asdas

  

dasdad

 */let res = str.replace(reg, ($0, $1, $2) => {  return `

${$2}

`})/** * 上面回调函数中的 $0 代表的是整个匹配到的内容,之后的$1 $2 就是从左 * 到右的原子组匹配到的内容 */console.log(res);

登录后复制

在这里插入图片描述

不记录分组

https? 代表前面的字符s可以有也可以没有 代表不记录到我们的
下面的(?:w+.) 原子组中的 ?: 代表不记录到我们的组编号之中

let str = `  https://www.nihao.com  http://nihao.com`let reg = /https?://((?:w+.)?w+.(?:com|cn|net))/gilet urls = []while ((res = reg.exec(str))) {  urls.push(res[1])}console.log(urls);

登录后复制

所以有没有www都能匹配到
在这里插入图片描述

多种重复匹配基本使用

+ : 一个或多个
* : 零个或多个
{a,b}: a-b范围内的出现次数
?: 零个或1个

// 多种重复匹配基本使用let str = 'asddddddddd'let str2 = 'as'console.log(str.match(/sd+/)); //1个或多个console.log(str2.match(/sd*/)); //0个或多个console.log(str.match(/sd{2,3}/)); // 2或3个console.log(str.match(/sd?/)); // 0个或1个

登录后复制

在这里插入图片描述

// 重复匹配对原子组的影响let str = 'asdddddsd'console.log(str.match(/(sd)+/g));  //["sd", "sd"]

登录后复制

限定用户名为3-8位并且是以字母开头

// 限定用户名为3-8位并且是以字母开头let username = 'a_Coding'let username1 = '2fdsdfd'let username2 = 's'let username3 = 'asdsadsadsad';console.log(/^[a-z]w{2,7}$/i.test(username));console.log(/^[a-z]w{2,7}$/i.test(username1));console.log(/^[a-z]w{2,7}$/i.test(username2));console.log(/^[a-z]w{2,7}$/i.test(username3));

登录后复制

在这里插入图片描述

禁止贪婪

使用正则/sd+/ 匹配上面字符串时+会默认贪婪多个d,+后面加个?就只会匹配一个d了 这就是禁止贪婪

// 禁止贪婪let str = 'asdddddd'/** * 使用正则/sd+/ 匹配上面字符串时+会默认贪婪多个d * +后面加个?就只会匹配一个d了  这就是禁止贪婪 */console.log(str.match(/sd+/)); //sdddddd console.log(str.match(/sd+?/)); //sd console.log(str.match(/sd*/)); //sdddddd console.log(str.match(/sd*?/)); //sd console.log(str.match(/sd{1,4}/));//sdddd console.log(str.match(/sd{1,4}?/));//sd

登录后复制

在这里插入图片描述

断言匹配

?= 后边是什么的

应该注意的是:断言只是对前面匹配的条件限定,并不参与实际的匹配结果中。
?= 中的等于号后面如果是个a,那么前面的匹配字符需要后面是a才会被匹配

// 断言匹配  ?=  后边是什么的let str = '我爱你,你爱他'let reg = /爱(?=你)/  //匹配后面有一个,号的loveconsole.log(str.replace(reg, '不爱'));  //我不爱你,你爱他

登录后复制

使用断言规范价格

let lessons = `  js,343元,400次  node.js,300.00元,134次  java,500元,432次`let reg = /(d+)(.00)?(?=元)/gilessons = lessons.replace(reg, (v, ...args) => {  console.log(args);  args[1] = args[1] || '.00'  return args.slice(0, 2).join('')})console.log(lessons);

登录后复制

在这里插入图片描述

?

理解上面的第一个断言这个也就能猜到意思了

//  ?

使用断言模糊电话号码

let users = `  乔丹电话:54088888888,  艾弗森电话;08888888845`// 给电话号码的后4位变成*let reg = /(?

在这里插入图片描述

?! 后面不是什么的就匹配

let str = 'hfewhieuwhf43758435efhiuewfhiew'let reg = /[a-z]+(?!d+)$/i  //取后面不是数字的字母 注意这里的这个$非常重要console.log(str.match(reg)); //efhiuewfhiew

登录后复制

?

let str = 'asdae334dsfdsff'let reg = /(?

字符串正则方法

登录后复制search : 返回索引值,找不到就是-1match: 返回匹配后的字符结果 数组matchAll 返回全局匹配的迭代对象split 分割字符串形成数组

/// 字符串正则方法let str = 'i love you'console.log(str.search('u')); // 返回索引值,找不到就是-1console.log(str.search(/o/));// 返回匹配后的字符结果  数组console.log(str.match(/o/));  //["o", index: 3, input: "i love you", groups: undefined]// matchAll splitlet date = '2001-1/1'console.log(date.split(/[-/]/)); //["2001", "1", "1"]

登录后复制

matchAll

  

all we need is love

  

all we need is love

  

all we need is love

   let reg = /([sS]+?)

登录后复制

在这里插入图片描述

$符号在正则替换中的使用

$& 代表匹配到的内容
$` 代表匹配到的前面内容
$’ 代表匹配到的后面内容

let date = '2013/5/6'let str = '(010)88888888  (020)88888888'let reg = /((d{3,4}))(d{7,8})/gconsole.log(str.replace(reg, "$1-$2"));// 010-88888888  020-88888888// $&  代表匹配到的内容  // $`  代表匹配到的前面内容// $'  代表匹配到的后面内容let str = '我爱你'console.log(str.replace(/爱/, '不$&')); //我不爱你console.log(str.replace(/爱/, "$`")); //我我你console.log(str.replace(/爱/, "$'")); //我你你

登录后复制

【推荐学习:javascript高级教程】

以上就是教你一招吃通javascript正则表达式的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2714385.html

(0)
上一篇 2025年3月7日 21:33:13
下一篇 2025年2月23日 14:10:48

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 一招搞定JavaScript猜数字小游戏

    本篇文章给大家详细介绍一下搞定javascript猜数字小游戏的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 JavaScript 猜数字小游戏 在1~10中随机抽取一个数字,(抽取的数字可以在控制台查看)只有十次…

    2025年3月7日
    200
  • 如何实现网页标题闪烁效果

    本篇文章给大家详细介绍一下实现网页标题闪烁效果的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 代码 // 获取当前网页标题    // console.log(document.title);    // docu…

    2025年3月7日
    200
  • js怎么设置css实现隐藏

    实现方法:首先使用“document.getElementById(“id值”)”语句获取指定元素对象;然后使用“元素对象.style.display=”none””语句即可控制css,实现隐…

    2025年3月7日
    200
  • 教你一招实现简单计算器

    本篇文章给大家详细介绍一下javascript实现简单计算器的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 JS实现简单计算器 页面布局设计(HTML+CSS)   由于在之前的博客中有对html和css进行详细的…

    2025年3月7日 编程技术
    200
  • 详解JS中值传递和引用传递的区别

    本篇文章带大家详细了解一下javascript中值和引用传递的区别。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 在JavaScript中,可以通过值和引用传递。两者之间的主要区别是,按值传递发生在赋值基本类型的时候,而…

    2025年3月7日
    200
  • javascript如何利用sum函数求和

    方法:1、使用对象arguments配合sum函数,语法“sum(参数){return arguments[下标]+arguments[下标]}”;2、sum函数中直接使用“+”,语法“sum(参数列表){return 参数1+参数2}”。…

    2025年3月7日
    200
  • javascript字符串和日期怎么互转

    javascript字符串和日期互转的方法:1、通过“if (month.length == 1) {…}”方法将日期转成字符串;2、通过“if(dateArr[1].indexOf(“0”) == 0)…

    2025年3月7日
    200
  • javascript怎么移除数组元素

    javascript移除数组元素的方法:1、通过length属性移除数组元素;2、通过delete关键字移除;3、通过栈方法移除;4、通过队列方法移除;5、通过操作方法移除;6、通过迭代方法移除;7、通过原型方法移除。 本文操作环境:win…

    2025年3月7日
    200
  • javascript是h5吗

    javascrip不是h5,javascrip是一种具有函数优先的轻量级、解释型或即时编译型的编程语言;而h5是指HTML5是互联网的下一代标准,是构建以及呈现互联网内容的一种语言方式。 本文操作环境:windows7系统、javascri…

    2025年3月7日
    200
  • 不属于javascript的数据类型是什么

    不属于javascript的数据类型是interface,interface是js中的保留字;而javascript的数据类型有Undefined、Number、Symbol等等。 本文操作环境:windows7系统、javascript1…

    2025年3月7日
    200

发表回复

登录后才能评论