Dart中如何通过正则保留单词首字符 其余字符替换为星号
问题原因
当前代码里的正则r'\S'会匹配所有非空白字符,替换时会把全部字母都换成*,因此输出全掩码的**** ***,没有保留每个单词的首字符。
修复方案
调整正则规则,只匹配每个单词里除首字母外的其余字符替换为*即可。使用正向零宽后行断言编写正则:RegExp(r'(?<=\S)\S')
规则逻辑:
(?<=\S)是零宽校验位,要求当前匹配位置的前一个字符必须是非空白字符- 后面的
\S是实际匹配替换的目标,也就是每个单词从第二个字符开始的所有字母,替换后正好保留首字母,其余字符对应替换为*
调整后可直接运行的代码
void main() { String txt = 'John Doe'; String hideStr = txt.replaceAll(RegExp(r'(?<=\S)\S'), '*'); print(hideStr); // 运行输出: J*** D** }
可选扩展实现
如果需要固定掩码长度(不随原单词长度变化星号数量),可以拆分单词后单独处理再拼接,示例代码:
void main() { String txt = 'John Doe'; String hideStr = txt.split(' ').map((word) { // 空字符串或单字符单词直接返回 if (word.length <= 1) return word; // 保留首字母,后面拼接固定长度掩码 return word[0] + '***'; }).join(' '); print(hideStr); // 运行输出: J*** D*** }
内容的提问来源于stack exchange,提问作者Nazarudin
相关产品推荐
相关产品推荐

