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.字符串查找
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

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

友情链接更多精彩内容