""" 字符串处理工具类 提供字符串相关的工具方法 作者: 张翔 日期: 2026-04-01 """ import random import string import re from typing import Optional class StringHelper: """字符串处理工具类""" @staticmethod def truncate(text: str, max_length: int = 100, suffix: str = "...") -> str: """ 截断字符串 Args: text: 原始字符串 max_length: 最大长度 suffix: 后缀 Returns: 截断后的字符串 """ if not text: return "" if len(text) <= max_length: return text return text[:max_length] + suffix @staticmethod def mask_phone(phone: str) -> str: """ 手机号脱敏 Args: phone: 手机号 Returns: 脱敏后的手机号 """ if not phone or len(phone) < 7: return phone return phone[:3] + "****" + phone[-4:] @staticmethod def mask_email(email: str) -> str: """ 邮箱脱敏 Args: email: 邮箱 Returns: 脱敏后的邮箱 """ if not email or "@" not in email: return email parts = email.split("@") username = parts[0] domain = parts[1] if len(username) <= 2: masked_username = username[0] + "***" else: masked_username = username[:2] + "***" return f"{masked_username}@{domain}" @staticmethod def mask_id_card(id_card: str) -> str: """ 身份证号脱敏 Args: id_card: 身份证号 Returns: 脱敏后的身份证号 """ if not id_card or len(id_card) < 8: return id_card return id_card[:4] + "**********" + id_card[-4:] @staticmethod def random_string(length: int = 16, chars: str = None) -> str: """ 生成随机字符串 Args: length: 长度 chars: 字符集,默认为字母数字 Returns: 随机字符串 """ if chars is None: chars = string.ascii_letters + string.digits return ''.join(random.choice(chars) for _ in range(length)) @staticmethod def camel_to_snake(name: str) -> str: """ 驼峰命名转下划线命名 Args: name: 驼峰命名字符串 Returns: 下划线命名字符串 """ if not name: return "" s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower() @staticmethod def snake_to_camel(name: str) -> str: """ 下划线命名转驼峰命名 Args: name: 下划线命名字符串 Returns: 驼峰命名字符串 """ if not name: return "" components = name.split('_') return components[0] + ''.join(x.title() for x in components[1:]) @staticmethod def is_empty(text: Optional[str]) -> bool: """ 判断字符串是否为空 Args: text: 字符串 Returns: 是否为空 """ return text is None or text.strip() == "" @staticmethod def default_if_empty(text: Optional[str], default: str) -> str: """ 如果字符串为空则返回默认值 Args: text: 字符串 default: 默认值 Returns: 字符串或默认值 """ return text if not StringHelper.is_empty(text) else default