如何在Java中将48a493d902b5转换为48:a4:93:d9:02:b5?能否用正则实现?
可以用正则实现,且方案更简洁
当然可以用正则表达式完成这个转换,相比while循环,正则写法更简洁直观,不需要手动处理索引和循环逻辑。
核心思路
匹配字符串中每两个连续的字符,在其后添加冒号,但避免在最后一组字符后加冒号。以下是几种常见编程语言的实现示例:
Python 实现
import re original_str = "48a493d902b5" formatted_str = re.sub(r'(..)(?!$)', r'\1:', original_str) print(formatted_str) # 输出: 48:a4:93:d9:02:b5
- 正则说明:
(..):捕获任意两个连续字符作为分组1(?!$):负向预查,确保当前匹配的位置不是字符串末尾\1::将匹配到的分组内容替换为「分组1内容+冒号」
如果觉得负向预查不好理解,也可以先给所有双字符加冒号,再去掉末尾多余的冒号:
formatted_str = re.sub(r'(..)', r'\1:', original_str).rstrip(':')
JavaScript 实现
const originalStr = "48a493d902b5"; const formattedStr = originalStr.replace(/(..)(?!$)/g, "$1:"); console.log(formattedStr); // 输出: 48:a4:93:d9:02:b5
- 注意要加
g修饰符,开启全局匹配,否则只会替换第一组双字符。
为什么正则更优?
- 代码行数更少,逻辑一目了然
- 无需手动管理循环索引、计数变量,减少人为出错的可能
- 对于这种固定格式的字符串转换,正则的执行效率和循环相当,甚至在某些引擎下表现更好
内容的提问来源于stack exchange,提问作者Alessandro Nunes Bertoni
相关产品推荐
相关产品推荐

