1.字符串类高频面试题

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!"
11.字符串查找
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 一、字符串在C#中,字符串是一系列不可修改的Unicode字符,创建字符串后,就不能修改它。要创建字符串,最常用的...
    CarlDonitz阅读 1,264评论 0 2
  • 1 字符编码 python中的编码采用的是Unicode编码。什么是编码?就是数字和字符的一一对应的,其中字符对应...
    barriers阅读 411评论 0 1
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,362评论 0 5
  •   引用类型的值(对象)是引用类型的一个实例。   在 ECMAscript 中,引用类型是一种数据结构,用于将数...
    霜天晓阅读 1,035评论 0 1
  • 第五章******************************************************...
    fastwe阅读 668评论 0 0