string_util.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import re
  2. from typing import Optional, Union
  3. class StringUtil:
  4. """字符串处理工具类"""
  5. @staticmethod
  6. def is_empty(s: Optional[str]) -> bool:
  7. """判断字符串是否为空
  8. Args:
  9. s: 输入字符串
  10. Returns:
  11. bool: 是否为空
  12. """
  13. return s is None or len(s.strip()) == 0
  14. @staticmethod
  15. def to_camel_case(s: str) -> str:
  16. """将下划线命名转换为驼峰命名
  17. Args:
  18. s: 输入字符串
  19. Returns:
  20. 驼峰命名字符串
  21. """
  22. parts = s.split('_')
  23. return parts[0] + ''.join(x.title() for x in parts[1:])
  24. @staticmethod
  25. def to_snake_case(s: str) -> str:
  26. """将驼峰命名转换为下划线命名
  27. Args:
  28. s: 输入字符串
  29. Returns:
  30. 下划线命名字符串
  31. """
  32. s = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', s)
  33. return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s).lower()
  34. @staticmethod
  35. def truncate(s: str, length: int, suffix: str = '...') -> str:
  36. """截断字符串
  37. Args:
  38. s: 输入字符串
  39. length: 最大长度
  40. suffix: 后缀
  41. Returns:
  42. 截断后的字符串
  43. """
  44. if len(s) <= length:
  45. return s
  46. return s[:length - len(suffix)] + suffix
  47. @staticmethod
  48. def is_email(s: str) -> bool:
  49. """验证是否为有效的邮箱地址
  50. Args:
  51. s: 输入字符串
  52. Returns:
  53. bool: 是否为有效邮箱
  54. """
  55. pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
  56. return bool(re.match(pattern, s))
  57. @staticmethod
  58. def is_phone(s: str) -> bool:
  59. """验证是否为有效的手机号码
  60. Args:
  61. s: 输入字符串
  62. Returns:
  63. bool: 是否为有效手机号
  64. """
  65. pattern = r'^1[3-9]\d{9}$'
  66. return bool(re.match(pattern, s))
  67. @staticmethod
  68. def join_with_comma(items: list) -> str:
  69. """将列表元素用逗号连接
  70. Args:
  71. items: 输入列表
  72. Returns:
  73. 连接后的字符串
  74. """
  75. return ', '.join(str(item) for item in items)