wingmeng / front-end-quiz

前端小测试答题收集
0 stars 0 forks source link

JS基础测试30:字符串长度判断 #8

Open wingmeng opened 5 years ago

wingmeng commented 5 years ago

题目:

image


我的答案:

没有什么字符串处理是用一个正则表达式解决不了的,如果有,那就用两个,事实上我用了四个。

DEMO 更精彩 (已封装,并提供测试用例)


第 1 题

这是送分题吗?

content.length > 140;

第 2 题

使用正则将所有连续空格、换行替换为1个

content.trim()  // 移除两端空格
  .replace(/[\r\n]+/g, '\n')  // 连续换行合并为 1 个
  .replace(/[ ]+/g, ' ')  // 内容中的连续空格合并成 1 个
  > 140;

第 3 题

原理:将内容按 2 个 ASCⅡ 字符作为切割点划分数组,累加统计数组项里面的字符数,再加上数组长度 - 1 的值,得到最终字数

var arr = content.trim()
  .replace(/[\r\n]+/g, '\n')
  .replace(/[ ]+/g, ' ')
  .split(/[\x00-\xff]{2}?/g);  // ASCⅡ 码范围(惰性匹配)
var len = arr.length - 1 + arr.reduce(function(total, cur) {
  return total += cur.length    
}, 0);
len > 140;

第 4 题

先按题 2 处理,然后使用正则匹配网址并替换为 10 个占位字符,最后按题 3 处理,统计最后字数

function fixASC2CharsNum(str) {
  var arr = str.split(/[\x00-\xff]{2}?/g);

  return arr.length - 1 +
    arr.reduce(function(total, cur) {
      return total += cur.length;
    }, 0);
}

content = content.trim()
  .replace(/[\r\n]+/g, '\n')
  .replace(/[ ]+/g, ' ');

var regex_url = /https?:\/\/(:?[\w-]+\.)+[\w-]+\S+\b/g;  // 网址(宽松判断)
var shortUrlCharsNum = 10;
var placeholder = Array(shortUrlCharsNum).fill('囧');

content = content.replace(regex_url, function(matched) {
  // 小于 10 个字符的不使用短网址
  if (fixASC2CharsNum(matched) < shortUrlCharsNum) {
    return matched;
  }

  return placeholder;
});

fixASC2CharsNum(content) > 140;
wingmeng commented 5 years ago

自我评分:优秀

优秀、良好、一般、差劲

学习收获:

  1. 数组 repeat 方法;
  2. 匹配内容中连续空格(不含换行)的正则为 /[ ]+/g
wingmeng commented 5 years ago

需注意多字节汉字的情况

https://blog.csdn.net/weixin_34344403/article/details/90973551