专栏首页前端下午茶JS 活学活用正则表达式

JS 活学活用正则表达式

JS RegExp Code Base

记录一些项目中用到的正则工具,将持续更新...

如果对JS中的正则不太了解,可以参考一下JS 中正则表达式必知必会

1. 字符串操作

去除字符串两边的空格 trim

String.prototype.trim = function() {
  return this.replace(/(^\s+)\|(\s+$)/g, '')
}

HTML编码,对< / > " & \等字符转义,避免XSS攻击

function htmlEncode(str) {
  return str.replace(/[\<\>\"\'\&]/g, function(rs) {
    switch (rs) {
      case '<':
        return '&lt;'
      case '>':
        return '&gt;'
      case '&':
        return '&amp;'
      case ''':
        return '&apos;'
      case '"':
        return '&quot;'
    }
  })
}

找出重复最多的字符

let str = 'asss23sjdssskssa7lsssdkjsssdss'
const arr = str.split(/\s*/)              // 把字符串转换为数组
const str2 = arr.sort().join('')              // 首先进行排序,这样结果会把相同的字符放在一起,然后再转换为字符串
let value = ''
let index = 0
str2.replace(/(\w)\1*/g, function($0, $1) {         // 匹配字符
  if (index < $0.length) {
    index = $0.length              // index是出现次数
    value = $1                  // value是对应字符
  }
})
console.log(`最多的字符: ${value} ,重复的次数: ${index}`)          // s 17

数字格式化,1234567890 -> 1,234,567,890

下面简单分析下正则/\B(?=(\d{3})+(?!\d))/g

  1. /\B(?=(\d{3})+(?!\d))/g:正则匹配非单词边界\B,边界后面必须跟着(\d{3})+(?!\d)
  2. (\d{3})+:必须是1个或多个的3个连续数字
  3. (?!\d):第2步中的3个数字不允许后面跟着数字
  4. (\d{3})+(?!\d):所以匹配的边界后面必须跟着3*n(n>=1)的数字

最终把匹配到的所有边界换成,即可

const numFormat = str => str.replace(/\B(?=(\d{3})+(?!\d))/g, ',')

手机号中间四位换*

手机号中间4位数换成*

const validateMobile = str => /^[1][0-9]{10}$/.test(str) && str.replace(/(\d{3})(\d{4})(\d{4})/, (rs, $1, $2, $3) => `${$1}****${$3}`)

取URL中query到一个对象中

function getUrlParam(str) {
  const result = {}
  const valid = /(https?|ftp):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.exec(str)
  if (!valid) return
  const [rs, $1, $2, $3] = valid
  $3.match(/[a-zA-Z_]+=[^=&?]*/g).forEach(val => val.replace(/^(\w+)=(\w*)$/, ($0, $1, $2) => {
        result[$1] = $2
      })
  )
  return result
}

getUrlParam('https://www.baidu.com?name=jawil&age=23&d=')         // {name: "jawil", age: "23", d: ""}

2. 验证

用于验证时,通常需要在前后分别加上^$\b,以匹配整个待验证字符串

常用正则验证

function checkStr(str, type) {
  switch (type) {
    case 'phone': //手机号码
      return /^1\d{10}$/.test(str)
    case 'tel': // 座机
      return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str)
    case 'card': // 身份证
      return /^\d{15}|\d{18}$/.test(str)
    case 'pwd': // 密码以字母开头,长度在6~18之间,只能包含字母、数字和下划线
      return /^[a-zA-Z]\w{5,17}$/.test(str)
    case 'postal': // 邮政编码
      return /[1-9]\d{5}(?!\d)/.test(str)
    case 'QQ': // QQ号 5-11位数字
      return /^[1-9]\d{4,10}$/.test(str)
    case 'email': // 邮箱
      return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str)
    case 'money': // 金额(小数点2位)
      return /^\d*(?:\.\d{0,2})?$/.test(str)
    case 'URL': // 网址
      return /(https?|ftp):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
    case 'IP': // IP
      return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str)
    case 'day': // 一个月的31天 01-09和1~31
      return /^((0?[1-9])|(([12])[0-9])|30|31)$/.test(str)
    case 'month': // 一年的12个月 01-09和1-12
      return /^(0?[1-9]|1[0-2])$/.test(str)
    case 'date': // 日期时间
      return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
    case 'integer': // 整数 正整数或负整数
      return /^-?\d+$/.test(str)
    case 'decimal': // 小数
      return /^(-?\d+)(\.\d+)?$/.test(str)
    case 'english': // 英文
      return /^[a-zA-Z]+$/.test(str)
    case 'chinese': // 中文
      return /^[\u4E00-\u9FA5]+$/.test(str)
    case 'cname': // 中文姓名 2-4位汉字
      return /^[\u4E00-\u9FA5]{2,4}$/.test(str)
    case 'lower': // 小写
      return /^[a-z]+$/.test(str)
    case 'upper': // 大写
      return /^[A-Z]+$/.test(str)
    case 'HTML': // HTML标记
      return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str)
    default:
      throw new Error('检验出错 in function checkStr')
  }
}

验证是否是合法URL

function validateURL(textval) {
  const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return urlregex.test(textval)
}

网上的帖子大多深浅不一,甚至有些前后矛盾,在下的文章都是学习过程中的总结,如果发现错误,欢迎留言指出~

参考: JavaScript正则进阶之路——活学妙用奇淫正则表达式 js正则验证方法大全 javascript 总结(RegExp篇)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《你不知道的JavaScript》 (上) 阅读摘要

    本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅;

    前端下午茶
  • 几种浏览器存储方法及其优缺点

    在做项目的过程中,我们经常遇到需要把信息存储在本地的情况,比如权限验证的token、用户信息、埋点计数、客户配置的皮肤信息或语言种类等,我们可以暂存一下避免浏览...

    前端下午茶
  • Vue源码阅读 - 依赖收集原理

    vue已是目前国内前端web端三分天下之一,同时也作为本人主要技术栈之一,在日常使用中知其然也好奇着所以然,另外最近的社区涌现了一大票vue源码阅读类的文章,在...

    前端下午茶
  • 轻量级的自动化应用 Taskzy

    轻量级的自动化应用 Taskzy,它能够监测系统状态变化,当出现如插拔耳机、步行、骑行、雨天等状态变化时,运行指定应用。@Appinn

    huginn 中文网
  • Unity UI案例(长按按钮和双击按钮案例

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    bering
  • 终于找到miniblink播放jwplayer不了的原因了

    起因是网友“国王与乞丐”反馈的http://lpl.qq.com/es/live.shtml页面播放不了flash。

    龙泉寺扫地僧
  • 用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。

         图像处理中,有很多算法由于其内在的复杂性是天然的耗时大户,加之图像本身蕴涵的数据量比一般的对象就大,因此,针对这类算法,执行速度的提在很大程度上依赖于...

    用户1138785
  • 封装一个 Swift-Style 的网络模块

    Swift 跟 OC 有着完全不同的设计哲学,它鼓励你使用 protocol 而不是 super class,使用 enum 和 struct 而不是 clas...

    Sheepy
  • 你知道HTTP协议的ETag是干什么的吗?

    在HTTP1.1规范中,新增了一个HTTP头信息:ETag。对于普通开发者来说,可能平时真的不会接触到该HTTP头。平时接触不到或者说用得少,不代表这个请求头不...

    Happyjava
  • 犀牛鸟人物丨专访人民大学范举老师:数据之美 ---社交影响力研究

    腾讯高校合作

扫码关注云+社区

领取腾讯云代金券