纪录一些项目中用到的正则东西,将延续更新…
假如对JS中的正则不太相识,能够参考一下JS 中正则表达式必知必会
1. 字符串操纵
1.1 去除字符串双方的空格 trim
String.prototype.trim = function() {
return this.replace(/(^\s+)\|(\s+$)/g, '')
}
1.2 HTML编码对< > ' " &
等字符转义,防止XSS进击
function htmlEncode(str) {
return str.replace(/[\<\>\"\'\&]/g, function(rs) {
switch (rs) {
case '<':
return '<'
case '>':
return '>'
case '&':
return '&'
case ''':
return '''
case '"':
return '"'
}
})
}
1.3 找出反复最多的字符
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
1.4 数字格式化,1234567890 -> 1,234,567,890
下面简朴剖析下正则/\B(?=(\d{3})+(?!\d))/g
:
-
/\B(?=(\d{3})+(?!\d))/g
:正则婚配非单词边境\B
,边境背面必需随着(\d{3})+(?!\d)
-
(\d{3})+
:必需是1个或多个的3个一连数字 -
(?!\d)
:第2步中的3个数字不允许背面随着数字 -
(\d{3})+(?!\d)
:所以婚配的边境背面必需随着3*n(n>=1)的数字
终究把婚配到的一切边境换成,
即可
const numFormat = str => str.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
1.5 手机号中心四位换*
手机号中心4位数换成*
const validateMobile = str => /^[1][0-9]{10}$/.test(str) && str.replace(/(\d{3})(\d{4})(\d{4})/, (rs, $1, $2, $3) => `${$1}****${$3}`)
1.6 取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: ""}
1.7 驼峰转下划线
'componentMapModelRegistry'.match(/^[a-z][a-z0-9]+|[A-Z][a-z0-9]*/g).join('_').toLowerCase();
// component_map_model_registry
1.8 下划线转驼峰
'component_map_model_registry'.replace(/_(\w)/g, (str, letter) => letter.toUpperCase())
// componentMapModelRegistry
1.9 猎取文件名信息,提取文件名和文件名后缀
export const getFileInfo = fileName => {
const fileRe = /(.+)(\.[a-z0-9]+)$/i
try {
const result = fileRe.exec(fileName)
return {
name: result[1],
type: result[2]
}
} catch (e) {
return null
}
}
2. 考证
用于考证时,一般须要在前后分别加上^
、$
、\b
,以婚配全部待考证字符串
2.1 经常使用正则考证
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')
}
}
2.2 考证是不是是正当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)
}
网上的帖子大多深浅不一,以至有些前后矛盾,鄙人的文章都是进修过程当中的总结,假如发明毛病,迎接留言指出~
参考:
PS:迎接人人关注我的民众号【前端下午茶】,一同加油吧~
别的能够到场「前端下午茶交换群」微信群,长按辨认下面二维码即可加我挚友,备注加群,我拉你入群~