Henry Henry
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)

Henry

小学生中的前端大佬
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)
  • JavaScript

    • js 编码指南
    • 日期使用斜杠 点 中划线分隔的不同
    • forEach 会改变原数组值吗
    • 前端表单验证常用的正则表达式 - reg
    • JS 如何取得 URL 里的参数
    • JavaScript 数组去重
    • JavaScript 循环中断研究与总结-关键字篇
    • JavaScript 循环中断研究与总结-用法篇
    • js 中的 Error
    • 跳出 forEach
    • Location 对象
    • Date 方法预览
    • Reg 正则中的问题
      • /[~!@#$%^&*()_+-=|\\{}\[\]:";'?,./]/ 这个正则怎么会匹配到数字呢?
        • 问题
        • 尝试
        • 解决
        • 疑惑
    • JavaScript toFixed() 方法
    • query 和 params 的使用区别
    • axios post 请求中下载文件流
    • 实用的 js 技巧
    • JS 之数组的几个不 low 操作
    • 深入浅出深拷贝与浅拷贝
    • 如何实现一个深拷贝
    • 使用 iframe 中的一些问题
    • 在 js 中更好地使用数组
    • echarts 在坐标轴两侧各增加一格坐标
    • 从头认识js的事件循环模型
    • moment 根据周截至日算出指定月有几周及开始结束日期
    • 正则 reg 中 /number 的用法
    • 正则 reg 中 match 和 exec 异同
  • TypeScript

  • Vue

  • ElementUI

  • React

  • AntD

  • 前端
  • JavaScript
Henry
2020-03-05
目录

Reg 正则中的问题

# /[~!@#$%^&*()_+-=|\\{}\[\]:";'<>?,./]/ 这个正则怎么会匹配到数字呢?

# 问题

最近在群里看到有童鞋问了这么一个问题:

/[~!@#$%^&*()_+-=|\\{}\[\]:";'<>?,./]/ 这个正则怎么会匹配到数字呢?

看这个样子应该是匹配特殊字符的正则,验证了一下,发现确实可以匹配数字

匹配到数字

注:所有数字均可以匹配,这里只列出几个

# 尝试

一开始以为是通配符 (.) 引起的,给 . 转义后,发现仍然能匹配到数字 (其实上图中已经排除通配符了,因为字母并没有匹配到); 又发现里面有好多特殊字符,比如 $^*()+|{}?, 等,那是这些引起的吗?先转义试试:

/[~!@#\$%\^&\*\(\)_\+-=\|\\\{\}\[\]:";'<>\?,\./]/

转义后

发现还是可以匹配到数字,而且 , 不可以转义,转义后什么也匹配不了了

最后查阅资料才发现

语法 说明 表达式示例 完整匹配的字符串
[...] 字符集 (字符类). 对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如 [abc] 或 [a-c]. 第一个字符如果是 ^ 则表示取反,如 [^abc] 表示不是 abc 的其他字符。所有的特殊字符在字符集中都失去其原有的特殊含义。在字符集中如果要使用 ]、- 或 ^, 可以在前面加上反斜杠,或把 ] 放在第一个字符,把 - 放在第一个或最后一个字符,把 ^ 放在非第一个字符。 a[bcd]e abe ace ade

关于以上知识,在这篇 PHP: 字符类 (方括号) - Manual (opens new window) 文章中也提到了,虽然和 js 有点出入,但意思是相通的

难怪转义完了没效果,原来特殊字符都失去原有意义了。

# 解决

有特殊意义的只有 ]、- 和 ^ 这三个,那再修改一下就可以了吧:

/[\]~!@#$%^&*()_+=|\\{}[:";'<>?,./-]/

成功

# 疑惑

  1. ] 放到首字符后什么也匹配不到了,目前只能转义
  2. , 转义后就什么也匹配不到了
  3. - 究竟是根据哪些字符判断出匹配范围包括数字的?

关于第三点:

目前只知道 +-= 这个正则可以匹配到数字,而且不仅匹配到数字,还匹配到额外到字符:

+-=

而 --_ 竟然还能额外匹配所有字母:

--_

将 +-= 和 --_ 的第一个字符替换为数字还会有意想不到的发现

但目前仍未知道其原理

编辑 (opens new window)
#Js#Reg
上次更新: 5/27/2023, 1:02:05 PM
Date 方法预览
JavaScript toFixed() 方法

← Date 方法预览 JavaScript toFixed() 方法→

最近更新
01
version 1.15
07-01
02
version 1.14
06-27
03
version 1.13
06-27
更多文章>
Theme by Vdoing | Copyright © 2017-2023 HenryTSZ | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式