1.查找字符串中出现最多的字符和个数
例: abckccdccacc-> 字符最多的是c,出现了7次
=====第一种=====
let str = 'abckccdccacc';
let num = 0,
char = '';
//=>1.对其进行排序
str = str.split('').sort((a, b) => a.localeCompare(b)).join('');
console.log(str) // =>aabcccccccdk;
//=> 2.定义正则表达式的匹配规则
let reg = /([a-zA-Z])\1+/g;
str.replace(reg, ($0, $1) => {
if (num < $0.length) {
num = $0.length;
char = $1;
}
});
console.log(`字符最多的是${char},出现了${num}次`);
=====第二种=====
定义一个对象,循环字符,比较个数
let obj = {};
[].forEach.call(str, char => {
if (typeof obj[char] !== "undefined") {
obj[char]++;
return;
}
obj[char] = 1;
});
let max = 1,
res = [];
for (let key in obj) {
let item = obj[key];
item > max ? max = item : null;
}
for (let key in obj) {
let item = obj[key];
if (item === max) {
res.push(key);
}
}
2.时间字符串格式化
可以把任何格式的日期时间转换为你想要的格式
~ function () {
/*
* formatTime:时间字符串的格式化处理
* @params
* templete:[string] 我们最后期望获取日期格式的模板
* 模板规则:{0}->年 {1~5}->月日时分秒
* @return
* [string]格式化后的时间字符串
* by LYR on 2019/01/1
*/
function formatTime(templete = "{0}年{1}月{2}日 {3}时{4}分{5}秒") {
let timeAry = this.match(/\d+/g);
return templete.replace(/\{(\d+)\}/g, (...[, $1]) => {
let time = timeAry[$1] || "00";
return time.length < 2 ? "0" + time : time;
});
}
/* 扩展到内置类String.prototype上 */
["formatTime"].forEach(item => {
String.prototype[item] = eval(item);
});
}();
let time = "2019-1-1 16:51:3";
console.log(time.formatTime());
console.log(time.formatTime("{0}年{1}月{2}日"));
console.log(time.formatTime("{1}-{2} {3}:{4}"));
time = "2019/1/1";
console.log(time.formatTime());
console.log(time.formatTime("{0}年{1}月{2}日"));
console.log(time.formatTime("{1}-{2} {3}:{4}"));
3.解析 URL Params 为对象
/*
* queryURLParams:获取URL地址问号和面的参数信息(可能也包含HASH值)
* @params
* @return
* [object]把所有问号参数信息以键值对的方式存储起来并且返回
* by LYR on 2019/01/01
*/
function queryURLParams() {
let obj = {};
this.replace(/([^?=&#]+)=([^?=&#]+)/g, (...[, $1, $2]) => obj[$1] = $2);
this.replace(/#([^?=&#]+)/g, (...[, $1]) => obj['HASH'] = $1);
return obj;
}
/* 扩展到内置类String.prototype上 */
["formatTime", "queryURLParams"].forEach(item => {
String.prototype[item] = eval(item);
});
}();
let url = "http://www.lalala.cn/?lx=1&from=wx#video";
console.log(url.queryURLParams());
//=>{lx:1,from:'wx',HASH:'video'}
4.实现千位分隔符
/*
* millimeter:实现大数字的千分符处理
* @params
* @return
* [string]千分符后的字符串
* by LYR on 2019/01/01
*/
function millimeter() {
return this.replace(/\d{1,3}(?=(\d{3})+$)/g, content => content + ',');
}
/* 扩展到内置类String.prototype上 */
String.prototype.millimeter= millimeter;
let num = "15628954"; //=>"15,628,954" 千分符
console.log(num.millimeter());
num = "112345678256874"; //=>"12,345,678,256,874"
console.log(num.millimeter());
====第二种===
// 把字符串倒过来加
num = num.split('').reverse().join('');
for (let i = 2; i < num.length - 1; i += 4) {
let prev = num.substring(0, i + 1),
next = num.substring(i + 1);
num = prev + "," + next;
}
num = num.split('').reverse().join('');
console.log(num);
5.验证是否为有效数字
/*
* 规则分析
* 1.可能出现 + - 号,也可能不出现 [+-]?
* 2.一位0-9都可以,多位首位不能是0 (\d|([1-9]\d+))
* 3.小数部分可能有可能没有,一旦有后面必须有小数点+数字 (\.\d+)?
*/
let reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/;
6.验证密码
//=>数字、字母、下划线
//=>6~16位
let val = userPassInp.value,
reg = /^\w{6,16}$/;
let flag=reg.test(val);
7.验证真实姓名的
/*
* 1.汉字 /^[\u4E00-\u9FA5]$/
* 2.名字长度 2~10位
* 3.可能有译名 ·汉字 (·[\u4E00-\u9FA5]{2,10}){0,2}
*/
let reg = /^[\u4E00-\u9FA5]{2,10}(·[\u4E00-\u9FA5]{2,10}){0,2}$/;
8.验证邮箱的
let reg = /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
//=> \w+((-\w+)|(\.\w+))*
//1.开头是数字字母下划线(1到多位)
//2.还可以是 -数字字母下划线 或者 .数字字母下划线,整体零到多次
//=>邮箱的名字由“数字、字母、下划线、-、.”几部分组成,但是-/.不能连续出现也不能作为开始
//=> @[A-Za-z0-9]+
//1.@后面紧跟着:数字、字母 (1-多位)
//=> ((\.|-)[A-Za-z0-9]+)*
//1.对@后面名字的补充
// 多域名 .com.cn
// 企业邮箱 zxt@lyr-gzs-office.com
//=> \.[A-Za-z0-9]+
//1. 这个匹配的是最后的域名(.com/.cn/.org/.edu/.net...)
9.身份证号码
/*
* 1. 一共18位
* 2. 最后一位可能是X
*
* 身份证前六位:省市县 130828
* 中间八位:年月日
* 最后四位:
* 最后一位 => X或者数字
* 倒数第二位 => 偶数 女 奇数 男
* 其余的是经过算法算出来的
*/
//let reg = /^\d{17}(\d|X)$/;
//=>小括号分组的第二个作用:分组捕获,不仅可以把大正则匹配的信息捕获到,还可以单独捕获到每个小分组的内容
let reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|X)$/;
reg.exec("130828200211040819"); //=>["130828199012040617", "130828", "1990", "12", "04", "1", "7"...] 捕获结果是数组,包含每一个小分组单独获取的内容
10. 单词首字母大写
let str = "good good study,day day up!";
let reg = /\b([a-zA-Z])[a-zA-Z]*\b/g;
//=>函数被执行了六次,每一次都把正则匹配信息传递给函数
//=>每一次ARG:["good","g"] ["good","g"] ["study","s"]...
str = str.replace(reg,(...arg)=>{
let [content,$1]=arg;
$1=$1.toUpperCase();
content=content.substring(1);
return $1+content;
});
console.log(str); //=>"Good Good Study,Day Day Up!"