js 如何将字符串中的大于8位的数字保留前3位,后面的替换成“*”

本文介绍了一种用于字符串脱敏处理的方法,通过特定的算法检查并替换敏感数字信息,确保了在展示含有敏感信息的字符串时的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<script>
var strCheck = function(str){
 var strFormat = "0123456789";
 for(var i=0;i<str.length;i++)
 {
  if(strFormat.indexOf(str.substr(i ,1)) == -1)
  {
   return false;
  }
 }
 return true;
};
function nto(str){
 var a = new Array();
 var b="";
 var k=0; 
 for(var i=0;i<str.length;i++){
  a[i] = str.substr(i,1);
  if(strCheck(a[i])){
   k++;
  }else{
   k=0;
  }
  if(k>=8){
   for(var j=i-4;j<=i;j++){
    a[j] = '*';
   }
  }
 }
 for(var i=0;i<str.length;i++){
  b += a[i]
 }
 return b;
}
var str = '234我不知道2342342342348号汽车的车票是10元还是1234567890元';
alert(nto(str))
</script>

<think>我们需要写一个方法,接收一个字符串,然后返回一个处理后的字符串:除了第一,其他置都替换成&#39;*&#39;。 注意边界情况:如果字符串为空或者长度小于等于1,则根据需求处理。例如,空字符串返回空,长度为1的字符串可以返回原字符串(因为除了第一没有其他字符)或者也可以返回第一(即原字符串)?根据题意,我们只替换其他置,所以长度为1时,没有其他置,则返回原字符串。 思路: 1. 如果输入字符串为null或undefined,可以返回空字符串或者抛出异常,这里我们按返回空字符串处理。 2. 如果字符串长度为0,返回空字符串3. 如果字符串长度为1,则返回原字符串(因为没有其他字符需要替换)。 4. 如果长度大于1,则取第一个字符,然后剩余部分用&#39;*&#39;填充,填充的长度为原字符串长度减1。 例如: 输入 "张三" -> "张*" 输入 "李四五" -> "李**" 输入 "王" -> "王" 输入 "" -> "" 实现方式: 我们可以使用字符串的substring或slice方法获取第一个字符,然后使用字符串重复方法(repeat)生成多个&#39;*&#39;,但是注意重复的次数是原字符串长度减1。 或者,我们可以将字符串转为数组,然后将除了第一个元素以外的所有元素替换为&#39;*&#39;,再合并成字符串。 这里我们选择第一种方法:使用substring(0,1)获取第一个字符,然后生成剩余长度的&#39;*&#39;。 代码: function maskString(str) { if (!str) return &#39;&#39;; // 处理空字符串、null、undefined等 const firstChar = str.substring(0, 1); const stars = &#39;*&#39;.repeat(str.length - 1); return firstChar + stars; } 但是注意:如果字符串长度小于1(即0),那么str.length-1为-1,repeat方法会报错,所以我们在面已经处理了空字符串的情况,所以当长度大于等于1时,才会执行repeat。 另一种情况:如果字符串是空格?比如" "(两个空格),那么第一个字符是空格,后面替换为*。根据需求,我们按照普通字符串处理。 如果需求是只处理非空字符串,那么我们的处理已经满足。 我们也可以使用数组的方式: function maskString(str) { if (!str) return &#39;&#39;; return str.split(&#39;&#39;).map((char, index) => index === 0 ? char : &#39;*&#39;).join(&#39;&#39;); } 两种方法都可以,第一种效率可能更高。 我们选择第一种实现。 但注意:如果字符串包含Unicode字符(如emoji、多字节字符),使用substring(0,1)可能只截取到一个字符(即使这个字符由多个码元组成)。但是,由于JavaScript中字符串处理是基于UTF-16的,对于基本多文种平面(BMP)的字符,一个字符用一个码元(16)表示,而辅助平面的字符用两个码元(代理对)表示。使用substring(0,1)会截取代理对的一半,导致乱码。 例如,字符"😊"(一个笑脸)的编码是&#39;\uD83D\uDE0A&#39;,如果使用str.substring(0,1)会得到&#39;\uD83D&#39;,这是一个无效字符。 因此,我们需要考虑Unicode安全的方式。可以使用Array.from或者扩展运算符将字符串分割成字符数组,然后取第一个字符。 修改方案: 使用Array.from(str)将字符串转为数组(这样可以正确分割Unicode字符),然后取第一个元素,后面用&#39;*&#39;重复剩下的字符个数(数组长度-1)。 例如: const arr = Array.from(str); if (arr.length === 0) return &#39;&#39;; const firstChar = arr[0]; const stars = &#39;*&#39;.repeat(arr.length - 1); return firstChar + stars; 这样对于多码元的字符也能正确处理。 所以最终代码: function maskString(str) { if (!str) return &#39;&#39;; const chars = Array.from(str); if (chars.length === 0) return &#39;&#39;; const firstChar = chars[0]; const restCount = chars.length - 1; return restCount > 0 ? firstChar + &#39;*&#39;.repeat(restCount) : firstChar; } 或者简化: function maskString(str) { if (!str) return &#39;&#39;; const chars = Array.from(str); return chars.length > 0 ? chars[0] + &#39;*&#39;.repeat(chars.length - 1) : &#39;&#39;; } 测试用例: maskString("") -> "" maskString("a") -> "a" maskString("ab") -> "a*" maskString("张三") -> "张*" // 这里“张”是一个字符,后面一个字符用*代替 maskString("😊😊") -> "😊*" // 第一个表情是一个字符,后面一个字符用*代替 注意:对于组合字符(如带音调的字符)可能还是有问题,但通常组合字符在JavaScript中也被视为多个字符。例如,"é"(e加上重音)可能是两个字符:&#39;e&#39;和&#39;\u0301&#39;。使用Array.from会拆成两个元素。所以如果第一个字符是组合字符,那么可能只显示基础字符,后面的组合标记会被替换成*。但根据需求,我们通常希望整个组合字符被视为一个“字符”,但处理起来比较复杂。考虑到需求是“除了第一”,这里我们按照JavaScript的字符(码点)来处理,即Array.from的方式已经足够,因为Array.from可以按Unicode码点分割。 因此,我们采用Array.from的方式。 现在,我们编写这个公共方法。</think>以下是一个实现该功能的公共方法,使用 JavaScript 编写,考虑到了空字符串、单字符字符串和 Unicode 字符的安全处理: ```javascript /** * 将字符串除第一外的所有字符替换为星号(*) * @param {string} str - 原始字符串 * @returns {string} 处理后的字符串 */ function maskString(str) { if (typeof str !== &#39;string&#39; || str.length === 0) return &#39;&#39;; // 使用 Array.from 确保正确处理 Unicode 字符 const chars = Array.from(str); return chars[0] + &#39;*&#39;.repeat(chars.length - 1); } ``` ### 使用示例: ```javascript console.log(maskString("张三")); // "张*" console.log(maskString("李四")); // "李*" console.log(maskString("王")); // "王" (单字符不变) console.log(maskString("")); // "" (空字符串) console.log(maskString("12345")); // "1****" console.log(maskString("😊🚀测试")); // "😊***" (正确处理Unicode) ``` ### 功能特点: 1. **安全处理边界情况**: - 空字符串返回空字符串 - 单字符字符串返回原字符 - 非字符串输入返回空字符串 2. **Unicode 安全**: - 使用 `Array.from()` 替代 `split(&#39;&#39;)` 或 `substring()`,确保正确处理多字节字符(如 emoji、中文等) 3. **高效实现**: - 使用 `String.prototype.repeat()` 高效生成星号序列 - 避免不必要的循环操作 4. **类型检查**: - 使用 `typeof` 检查确保输入为字符串类型 ### 注意事项: - 对于包含代理对(surrogate pairs)的 Unicode 字符(如 emoji),传统方法会将其拆分为两个字符,而本方法能正确处理为单个字符 - 如果希望保留最后一可见,只需修改为:`chars[0] + &#39;*&#39;.repeat(chars.length - 2) + chars[chars.length - 1]`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值