目录
正则表达式的作用
创建正则表达式的方式
字面量形式
使用对象的形式创建正则表达式
小案例-实现输入字符高亮
选择符
对转义的理解
字符边界约束
元字符
用 [ ] 巧妙匹配所有字符
模式符
多行匹配
字符属性
lastIndex属性
有效率的y模式
原子表和原子组的基本使用
邮箱验证
原子组的替换操作
不记录分组
多种重复匹配基本使用
禁止贪婪
断言匹配
?= 后边是什么的
?<= 前面是什么的
?! 后面不是什么的就匹配
?<! 前面不是什么的就匹配
字符串正则方法
$符号在正则替换中的使用
首页 web前端 js教程 教你一招吃通javascript正则表达式

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

Apr 21, 2021 am 09:33 AM
javascript 正则表达式

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

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

正则表达式的作用

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

创建正则表达式的方式

字面量形式

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

const reg = "sattre is smart"
let x = &#39;s&#39;
console.log(/x/.test(reg)); //false
登录后复制

除非改成这样

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

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

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

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

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

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

<!DOCTYPE html><html lang="en"><head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title></head><body>
  <p id="main">
    All we need is love  </p></body><script>
  const cin = prompt(&#39;输入想要高亮内容&#39;)
  const reg = new RegExp(cin, &#39;g&#39;)
  let mainp = document.querySelector(&#39;#main&#39;)
  console.log(mainp);
  mainp.innerHTML = mainp.innerHTML.replace(reg, matched => {
    return `<span style="color:red">${matched}</span>`
  })</script></html>
登录后复制

选择符

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

let str1 = &#39;a&#39;
let str2 = &#39;b&#39;
console.log(/a|b/.test(str1)); //true
console.log(/a|b/.test(str2)); //true
登录后复制

对转义的理解

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

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

// 匹配小数点 \.
let price = 23.34
console.log(/\d+\.\d+/.test(23.34)); //true
登录后复制

但是需要注意的来了

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

如下

let reg = new RegExp(&#39;\d+\.\d+&#39;)
console.log(reg.test(price)); //false
登录后复制
console.log(&#39;/\d+\.\d+/&#39;);
登录后复制

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

let reg1 = new RegExp(&#39;\\d+\\.\\d+&#39;)
console.log(reg1.test(price)); //true
登录后复制

再来一个

const url = &#39;https://space.bilibili.com/17819768/&#39; 
console.log(/https?:\/\/\w+\.\w+\.\w+\/\d+\//.test(url)); //true
登录后复制

字符边界约束

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

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

let str = &#39;2dasdjifeiorepo&#39;
let str2 = &#39;3dsf5&#39;
console.log(/^\d\w+\d$/.test(str));
console.log(/^\d\w+\d$/.test(str2));
登录后复制

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

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

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

<!DOCTYPE html><html lang="en"><head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title></head><body>
  <input type="text" name="user">
  <span></span>
  <script>
    let input = document.querySelector("[name=&#39;user&#39;]")
    let span = document.querySelector(&#39;span&#39;)
    console.log(input);
    input.addEventListener(&#39;keyup&#39;, function () {
      // console.log(this.value.match(/^\w{3,6}$/));
      if (this.value.match(/^\w{3,6}$/)) {
        span.innerHTML = &#39;正确格式&#39;
      }else{
        span.innerHTML = &#39;请输入3-6位字符&#39;
      }
    })
  </script></body></html>
登录后复制

元字符

元字符匹配
\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 = &#39;aaaabsdsc&#39;
console.log(str.match(/[abc]/g));
console.log(str.match(/abc/g));
登录后复制

在这里插入图片描述
可以用 [\s\S] [\d\D] 匹配所有字符

let str = &#39;$%^&*()(*&^&*(sfhsdjf   asdoia ..fdsdgf nsefxg\][iogjpsf&#39;
console.log(str.length);
console.log(str.match(/[\s\S]/g));
登录后复制

在这里插入图片描述

模式符

  • i : 不区分大小写
  • g: 全局匹配
let str = &#39;Www&#39;
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*/, &#39;&#39;).replace(/#/, &#39;&#39;)
  let [name, price] = item.split(",")
  return { name, price }})console.log(res);
登录后复制

字符属性

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

元字符 含义

  • \p{L} 所有字母
  • \p{N} 所有数字,类似于 \d
  • [\p{N}\p{L}] 所有数字和所有字母,类似于 \w
  • \P{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 = &#39;nihaowoshizhongguoren&#39;
let reg = /\w/g
console.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 = &#39;尼采的电话是:516515614,111111111,2222222222 没重要的事千万不要打给他,因为他已经疯了&#39;
let reg = /(\d+),?/yreg.lastIndex = 7
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
登录后复制

在这里插入图片描述

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

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

let str = &#39;paul_sattre&#39;
console.log(str.match(/st/g)); //需要st一起才能匹配
console.log(str.match(/[st]/g)); //需要只要有s 或者 t 就可以匹配
登录后复制
let date1 = &#39;2021/4/9&#39;
let date2 = &#39;2021-4-9&#39;
console.log(date1.match(/\d+[-\/]\d+[-\/]\d+/));
console.log(date2.match(/\d+[-\/]\d+[-\/]\d+/));
登录后复制

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

let date1 = &#39;2021/4/9&#39;
let date2 = &#39;2021-4-9&#39;
let date3 = &#39;2021-4/9&#39;
console.log(date1.match(/\d+([-\/])\d+\1\d+/));
console.log(date2.match(/\d+([-\/])\d+\1\d+/));
console.log(date3.match(/\d+([-\/])\d+\1\d+/));
登录后复制

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

邮箱验证

// 邮箱验证
let str = &#39;483023989@qq.com.cn&#39;
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 = `
  <h1>hello</h1>
  <h2>asdas</h2>
  <h3>dasdad</h3>
`let reg = /<(h[1-6])>([\s\S]+)<\/\1>/gi// console.log(str.replace(reg, &#39;<p>$2</p>&#39;));/**
 *   
  <p>hello</p>
  <p>asdas</p>
  <p>dasdad</p>
 */let res = str.replace(reg, ($0, $1, $2) => {
  return `<p>${$2}</p>`})/**
 * 上面回调函数中的 $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))/gi

let urls = []

while ((res = reg.exec(str))) {
  urls.push(res[1])
}
console.log(urls);
登录后复制

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

多种重复匹配基本使用

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

// 多种重复匹配基本使用
let str = &#39;asddddddddd&#39;
let str2 = &#39;as&#39;
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 = &#39;asdddddsd&#39;
console.log(str.match(/(sd)+/g));  //["sd", "sd"]
登录后复制

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

// 限定用户名为3-8位并且是以字母开头
let username = &#39;a_Coding&#39;
let username1 = &#39;2fdsdfd&#39;
let username2 = &#39;s&#39;
let username3 = &#39;asdsadsadsad&#39;;
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 = &#39;asdddddd&#39;/**
 * 使用正则/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 = &#39;我爱你,你爱他&#39;
let reg = /爱(?=你)/  //匹配后面有一个,号的love
console.log(str.replace(reg, &#39;不爱&#39;));  //我不爱你,你爱他
登录后复制

使用断言规范价格

let lessons = `
  js,343元,400次
  node.js,300.00元,134次
  java,500元,432次
`let reg = /(\d+)(.00)?(?=元)/gi
lessons = lessons.replace(reg, (v, ...args) => {
  console.log(args);
  args[1] = args[1] || &#39;.00&#39;
  return args.slice(0, 2).join(&#39;&#39;)})console.log(lessons);
登录后复制

在这里插入图片描述

?<= 前面是什么的

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

//  ?<=  前面是什么的
let str = &#39;我爱你,你爱他&#39;
let reg1 = /(?<=你)爱/
console.log(str.replace(reg1, &#39;不爱&#39;));// 我爱你,你不爱他
登录后复制

使用断言模糊电话号码

let users = `
  乔丹电话:54088888888,
  艾弗森电话;08888888845
`// 给电话号码的后4位变成*
let reg = /(?<=\d{7})\d+/g// 
console.log(users.match(reg));
users = users.replace(reg, &#39;*&#39;.repeat(4))
console.log(users);
登录后复制

在这里插入图片描述

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

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

?
let str = &#39;asdae334dsfdsff&#39;
let reg = /(?<!\d+)[a-z]+/i
console.log(str.match(reg));  //asdae
登录后复制

字符串正则方法

  • search : 返回索引值,找不到就是-1
  • match: 返回匹配后的字符结果 数组
  • matchAll 返回全局匹配的迭代对象
  • split 分割字符串形成数组
/// 字符串正则方法
let str = &#39;i love you&#39;

console.log(str.search(&#39;u&#39;)); // 返回索引值,找不到就是-1
console.log(str.search(/o/));

// 返回匹配后的字符结果  数组
console.log(str.match(/o/));  //["o", index: 3, input: "i love you", groups: undefined]

// matchAll split
let date = &#39;2001-1/1&#39;

console.log(date.split(/[-\/]/)); //["2001", "1", "1"]
登录后复制

matchAll

<body>
  <h1>all we need is love</h1>
  <h2>all we need is love</h2>
  <h3>all we need is love</h3>
  <script>
    let reg = /<(h[1-6])>([\s\S]+?)<\/\1>/gi
    const content = document.body.innerHTML.matchAll(reg)
    // console.log(content);
    let res = []
    for (const it of content) {
      // console.log(it);
      res.push(it[2])
    }
    console.log(res);


    let str = &#39;woainiw&#39;


    // 为低端浏览器自定义原型方法matchALl
    String.prototype.matchAll = function (reg) {
      let res = this.match(reg)
      if (res) {
        let str = this.replace(res[0], &#39;^&#39;.repeat(res[0].length))
        let match = str.matchAll(reg) || []
        return [res, ...match]
      }
    }

    console.log(str.matchAll(/(w)/i));
  </script></body>
登录后复制

在这里插入图片描述

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

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

let date = &#39;2013/5/6&#39;


let str = &#39;(010)88888888  (020)88888888&#39;
let reg = /\((\d{3,4})\)(\d{7,8})/g
console.log(str.replace(reg, "$1-$2"));
// 010-88888888  020-88888888

// $&  代表匹配到的内容  
// $`  代表匹配到的前面内容
// $&#39;  代表匹配到的后面内容
let str = &#39;我爱你&#39;
console.log(str.replace(/爱/, &#39;不$&&#39;)); //我不爱你
console.log(str.replace(/爱/, "$`")); //我我你
console.log(str.replace(/爱/, "$&#39;")); //我你你
登录后复制

【推荐学习:javascript高级教程

以上是教你一招吃通javascript正则表达式的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP正则表达式验证:数字格式检测 PHP正则表达式验证:数字格式检测 Mar 21, 2024 am 09:45 AM

PHP正则表达式验证:数字格式检测在编写PHP程序时,经常需要对用户输入的数据进行验证,其中一个常见的验证是检查数据是否符合指定的数字格式。在PHP中,可以使用正则表达式来实现这种验证。本文将介绍如何使用PHP正则表达式来验证数字格式,并提供具体的代码示例。首先,让我们看一下常见的数字格式验证要求:整数:只包含数字0-9,可以以正负号开头,不包含小数点。浮点

如何使用正则表达式在 Golang 中验证电子邮件地址? 如何使用正则表达式在 Golang 中验证电子邮件地址? May 31, 2024 pm 01:04 PM

要使用正则表达式在Golang中验证电子邮件地址,请执行以下步骤:使用regexp.MustCompile创建一个正则表达式模式,匹配有效的电子邮件地址格式。使用MatchString函数检查字符串是否与模式匹配。该模式涵盖了大多数有效的电子邮件地址格式,包括:局部用户名可以包含字母、数字和特殊字符:!.#$%&'*+/=?^_{|}~-`域名至少包含一个字母,后面可以跟字母、数字或连字符顶级域名(TLD)不能超过63个字符长

如何在 Go 中使用正则表达式匹配时间戳? 如何在 Go 中使用正则表达式匹配时间戳? Jun 02, 2024 am 09:00 AM

在Go中,可以使用正则表达式匹配时间戳:编译正则表达式字符串,例如用于匹配ISO8601时间戳的表达式:^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$。使用regexp.MatchString函数检查字符串是否与正则表达式匹配。

简易JavaScript教程:获取HTTP状态码的方法 简易JavaScript教程:获取HTTP状态码的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教程:如何获取HTTP状态码,需要具体代码示例前言:在Web开发中,经常会涉及到与服务器进行数据交互的场景。在与服务器进行通信时,我们经常需要获取返回的HTTP状态码来判断操作是否成功,根据不同的状态码来进行相应的处理。本篇文章将教你如何使用JavaScript获取HTTP状态码,并提供一些实用的代码示例。使用XMLHttpRequest

PHP正则表达式:精确匹配与排除模糊包含 PHP正则表达式:精确匹配与排除模糊包含 Feb 28, 2024 pm 01:03 PM

PHP正则表达式:精确匹配与排除模糊包含正则表达式是一种强大的文本匹配工具,能够帮助程序员在处理文本时进行高效的搜索、替换和筛选。在PHP中,正则表达式也被广泛应用于字符串处理和数据匹配中。本文将重点介绍在PHP中如何进行精确匹配和排除模糊包含的操作,同时结合具体的代码示例进行说明。精确匹配精确匹配意味着只匹配符合完全条件的字符串,不匹配任何变种或包含额外字

如何在 Go 中使用正则表达式验证密码? 如何在 Go 中使用正则表达式验证密码? Jun 02, 2024 pm 07:31 PM

Go中使用正则表达式验证密码的方法如下:定义正则表达式模式,符合最低密码要求:至少8个字符,包含小写字母、大写字母、数字和特殊字符。使用regexp包中的MustCompile函数编译正则表达式模式。使用MatchString方法测试输入字符串是否与正则表达式模式匹配。

中文字符过滤:PHP正则表达式实践 中文字符过滤:PHP正则表达式实践 Mar 24, 2024 pm 04:48 PM

PHP是一种广泛应用的编程语言,特别在Web开发领域中非常流行。在Web开发过程中,经常会遇到需要对用户输入的文本进行过滤、验证等操作,其中字符过滤是一项十分重要的操作。本文将介绍如何使用PHP中的正则表达式来实现中文字符过滤的功能,并给出具体的代码示例。首先,我们需要明确一下中文字符的Unicode范围是从u4e00到u9fa5,即所有的汉字都处于这个范围

如何在JavaScript中获取HTTP状态码的简单方法 如何在JavaScript中获取HTTP状态码的简单方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP状态码获取方法简介:在进行前端开发中,我们常常需要处理与后端接口的交互,而HTTP状态码就是其中非常重要的一部分。了解和获取HTTP状态码有助于我们更好地处理接口返回的数据。本文将介绍使用JavaScript获取HTTP状态码的方法,并提供具体代码示例。一、什么是HTTP状态码HTTP状态码是指当浏览器向服务器发起请求时,服务

See all articles