鸿蒙NEXT开发正则工具类RegexUtil(ArkTs)

复制代码
import { FormatUtil } from './FormatUtil';

/**
 * 正则工具类
 * @author CSDN-鸿蒙布道师
 * @since 2025/04/27
 */
export class RegexUtil {
  /**
   * 英文字母、数字和下划线
   */
  static readonly REG_GENERAL = "^\\w+$";

  /**
   * 数字
   */
  static readonly REG_NUMBERS = "^\\d+$";

  /**
   * 字母
   */
  static readonly REG_WORD = "^[a-zA-Z]+$";

  /**
   * 单个中文汉字
   * 参考维基百科汉字 Unicode 范围 (https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97)
   */
  static readonly REG_CHINESE =
    "^[\u2E80-\u2EFF\u2F00-\u2FDF\u31C0-\u31EF\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF\uD840\uDC00-\uD869\uDEDF\uD869\uDF00-\uD86D\uDF3F\uD86D\uDF40-\uD86E\uDC1F\uD86E\uDC20-\uD873\uDEAF\uD87E\uDC00-\uD87E\uDE1F]$";

  /**
   * 中文汉字(一个或多个)
   */
  static readonly REG_CHINESES = `${RegexUtil.REG_CHINESE}+`;

  /**
   * 分组匹配变量
   */
  static readonly REG_GROUP_VAR = "^\\$(\\d+)$";

  /**
   * IPv4 地址
   */
  static readonly REG_IPV4 =
    "^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)$";

  /**
   * IPv6 地址
   */
  static readonly REG_IPV6 =
    "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$";

  /**
   * 货币金额
   */
  static readonly REG_MONEY = "^(\\d+(?:\\.\\d+)?)$";

  /**
   * 邮件地址,符合 RFC 5322 规范
   * 来源:http://emailregex.com/
   */
  static readonly REG_EMAIL =
    "^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)])$";

  /**
   * 移动电话号码(中国大陆)
   */
  static readonly REG_MOBILE = "^(?:0|86|\\+86)?1[3-9]\\d{9}$";

  /**
   * 中国香港移动电话号码
   */
  static readonly REG_MOBILE_HK = "^(?:0|852|\\+852)?\\d{8}$";

  /**
   * 中国台湾移动电话号码
   */
  static readonly REG_MOBILE_TW = "^(?:0|886|\\+886)?(?:|-)09\\d{8}$";

  /**
   * 中国澳门移动电话号码
   */
  static readonly REG_MOBILE_MO = "^(?:0|853|\\+853)?(?:|-)6\\d{7}$";

  /**
   * 座机号码
   */
  static readonly REG_TEL = "^(010|02\\d|0[3-9]\\d{2})-?(\\d{6,8})$";

  /**
   * 座机号码 + 400/800 电话
   */
  static readonly REG_TEL_400_800 =
    "^0\\d{2,3}[\\- ]?[1-9]\\d{6,7}|[48]00[\\- ]?[1-9]\\d{6}$";

  /**
   * 18 位身份证号码
   */
  static readonly REG_CITIZEN_ID =
    "^[1-9]\\d{5}[1-2]\\d{3}((0\\d)|(1[0-2]))(([012]\\d)|3[0-1])\\d{3}(\\d|X|x)$";

  /**
   * 邮编(兼容港澳台)
   */
  static readonly REG_ZIP_CODE =
    "^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[0-7]|6[0-7]|7[0-5]|8[0-9]|9[0-8])\\d{4}|99907[78]$";

  /**
   * 生日
   */
  static readonly REG_BIRTHDAY =
    "^(\\d{2,4})([/\\-.年]?)(\\d{1,2})([/\\-.月]?)(\\d{1,2})日?$";

  /**
   * URI
   * 定义见:https://www.ietf.org/rfc/rfc3986.html#appendix-B
   */
  static readonly REG_URI =
    "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$";

  /**
   * URL
   */
  static readonly REG_URL =
    "^[a-zA-Z]+://[\\w-+&@#/%?=~_|!:,.;]*[\\w-+&@#/%=~_|]$";

  /**
   * HTTP URL(支持 FTP、File 等协议)
   */
  static readonly REG_URL_HTTP =
    "^(https?|ftp|file)://[\\w-+&@#/%?=~_|!:,.;]*[\\w-+&@#/%=~_|]$";

  /**
   * 中文字、英文字母、数字和下划线
   */
  static readonly REG_GENERAL_WITH_CHINESE = "^[\u4E00-\u9FFF\\w]+$";

  /**
   * UUID
   */
  static readonly REG_UUID =
    "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$";

  /**
   * 不带横线的 UUID
   */
  static readonly REG_UUID_SIMPLE = "^[0-9a-fA-F]{32}$";

  /**
   * MAC 地址
   */
  static readonly REG_MAC_ADDRESS =
    "^((?:[a-fA-F0-9]{1,2}[:-]){5}[a-fA-F0-9]{1,2})|0x(\\d{12}).+ETHER$";

  /**
   * 16 进制字符串
   */
  static readonly REG_HEX = "^[a-fA-F0-9]+$";

  /**
   * 时间格式
   */
  static readonly REG_TIME = "^\\d{1,2}:\\d{1,2}(:\\d{1,2})?$";

  /**
   * 中国车牌号码(兼容新能源车牌)
   */
  static readonly REG_PLATE_NUMBER =
    "^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[ABCDEFGHJK])|([ABCDEFGHJK]([A-HJ-NP-Z0-9])[0-9]{4})))|" +
      "([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]\\d{3}\\d{1,3}[领])|" +
      "([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$";

  /**
   * 社会统一信用代码
   */
  static readonly REG_CREDIT_CODE =
    "^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$";

  /**
   * 车架号(车辆识别代号)
   */
  static readonly REG_CAR_VIN =
    "^[A-HJ-NPR-Z0-9]{8}[0-9X][A-HJ-NPR-Z0-9]{2}\\d{6}$";

  /**
   * 驾驶证档案编号(中国驾驶证档案编号)
   */
  static readonly REG_CAR_DRIVING_LICENCE = "^[0-9]{12}$";

  /**
   * 中文姓名
   */
  static readonly REG_CHINESE_NAME = "^[\u2E80-\u9FFF·]{2,60}$";

  /**
   * 匹配表情符号(包括单个和组合表情)
   */
  static readonly REG_EMOJI =
    "(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])";

  /**
   * 判断内容是否匹配指定正则
   * @param content 待验证的内容
   * @param pattern 正则表达式
   * @returns 是否匹配
   */
  private static isMatch(content: string | null | undefined, pattern: string): boolean {
    if (!content) return false;
    const regex = new RegExp(pattern);
    return regex.test(content);
  }

  /**
   * 判断邮箱格式是否正确
   * @param content 邮箱地址
   * @returns 是否匹配
   */
  static isEmail(content: string): boolean {
    return RegexUtil.isMatch(content, RegexUtil.REG_EMAIL);
  }

  /**
   * 判断是否包含表情符号
   * @param content 待验证的内容
   * @returns 是否包含表情
   */
  static containsEmoji(content: string): boolean {
    return RegexUtil.isMatch(content, RegexUtil.REG_EMOJI);
  }

  /**
   * 判断电话号码格式是否正确
   * @param phone 电话号码
   * @returns 是否匹配
   */
  static isPhone(phone: string): boolean {
    return FormatUtil.isPhone(phone);
  }
}
代码如下:
TypeScript 复制代码
import { FormatUtil } from './FormatUtil';

/**
 * 正则工具类
 * @author CSDN-鸿蒙布道师
 * @since 2025/04/27
 */
export class RegexUtil {
  /**
   * 英文字母、数字和下划线
   */
  static readonly REG_GENERAL = "^\\w+$";

  /**
   * 数字
   */
  static readonly REG_NUMBERS = "^\\d+$";

  /**
   * 字母
   */
  static readonly REG_WORD = "^[a-zA-Z]+$";

  /**
   * 单个中文汉字
   * 参考维基百科汉字 Unicode 范围 (https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97)
   */
  static readonly REG_CHINESE =
    "^[\u2E80-\u2EFF\u2F00-\u2FDF\u31C0-\u31EF\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF\uD840\uDC00-\uD869\uDEDF\uD869\uDF00-\uD86D\uDF3F\uD86D\uDF40-\uD86E\uDC1F\uD86E\uDC20-\uD873\uDEAF\uD87E\uDC00-\uD87E\uDE1F]$";

  /**
   * 中文汉字(一个或多个)
   */
  static readonly REG_CHINESES = `${RegexUtil.REG_CHINESE}+`;

  /**
   * 分组匹配变量
   */
  static readonly REG_GROUP_VAR = "^\\$(\\d+)$";

  /**
   * IPv4 地址
   */
  static readonly REG_IPV4 =
    "^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)$";

  /**
   * IPv6 地址
   */
  static readonly REG_IPV6 =
    "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$";

  /**
   * 货币金额
   */
  static readonly REG_MONEY = "^(\\d+(?:\\.\\d+)?)$";

  /**
   * 邮件地址,符合 RFC 5322 规范
   * 来源:http://emailregex.com/
   */
  static readonly REG_EMAIL =
    "^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)])$";

  /**
   * 移动电话号码(中国大陆)
   */
  static readonly REG_MOBILE = "^(?:0|86|\\+86)?1[3-9]\\d{9}$";

  /**
   * 中国香港移动电话号码
   */
  static readonly REG_MOBILE_HK = "^(?:0|852|\\+852)?\\d{8}$";

  /**
   * 中国台湾移动电话号码
   */
  static readonly REG_MOBILE_TW = "^(?:0|886|\\+886)?(?:|-)09\\d{8}$";

  /**
   * 中国澳门移动电话号码
   */
  static readonly REG_MOBILE_MO = "^(?:0|853|\\+853)?(?:|-)6\\d{7}$";

  /**
   * 座机号码
   */
  static readonly REG_TEL = "^(010|02\\d|0[3-9]\\d{2})-?(\\d{6,8})$";

  /**
   * 座机号码 + 400/800 电话
   */
  static readonly REG_TEL_400_800 =
    "^0\\d{2,3}[\\- ]?[1-9]\\d{6,7}|[48]00[\\- ]?[1-9]\\d{6}$";

  /**
   * 18 位身份证号码
   */
  static readonly REG_CITIZEN_ID =
    "^[1-9]\\d{5}[1-2]\\d{3}((0\\d)|(1[0-2]))(([012]\\d)|3[0-1])\\d{3}(\\d|X|x)$";

  /**
   * 邮编(兼容港澳台)
   */
  static readonly REG_ZIP_CODE =
    "^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[0-7]|6[0-7]|7[0-5]|8[0-9]|9[0-8])\\d{4}|99907[78]$";

  /**
   * 生日
   */
  static readonly REG_BIRTHDAY =
    "^(\\d{2,4})([/\\-.年]?)(\\d{1,2})([/\\-.月]?)(\\d{1,2})日?$";

  /**
   * URI
   * 定义见:https://www.ietf.org/rfc/rfc3986.html#appendix-B
   */
  static readonly REG_URI =
    "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$";

  /**
   * URL
   */
  static readonly REG_URL =
    "^[a-zA-Z]+://[\\w-+&@#/%?=~_|!:,.;]*[\\w-+&@#/%=~_|]$";

  /**
   * HTTP URL(支持 FTP、File 等协议)
   */
  static readonly REG_URL_HTTP =
    "^(https?|ftp|file)://[\\w-+&@#/%?=~_|!:,.;]*[\\w-+&@#/%=~_|]$";

  /**
   * 中文字、英文字母、数字和下划线
   */
  static readonly REG_GENERAL_WITH_CHINESE = "^[\u4E00-\u9FFF\\w]+$";

  /**
   * UUID
   */
  static readonly REG_UUID =
    "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$";

  /**
   * 不带横线的 UUID
   */
  static readonly REG_UUID_SIMPLE = "^[0-9a-fA-F]{32}$";

  /**
   * MAC 地址
   */
  static readonly REG_MAC_ADDRESS =
    "^((?:[a-fA-F0-9]{1,2}[:-]){5}[a-fA-F0-9]{1,2})|0x(\\d{12}).+ETHER$";

  /**
   * 16 进制字符串
   */
  static readonly REG_HEX = "^[a-fA-F0-9]+$";

  /**
   * 时间格式
   */
  static readonly REG_TIME = "^\\d{1,2}:\\d{1,2}(:\\d{1,2})?$";

  /**
   * 中国车牌号码(兼容新能源车牌)
   */
  static readonly REG_PLATE_NUMBER =
    "^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[ABCDEFGHJK])|([ABCDEFGHJK]([A-HJ-NP-Z0-9])[0-9]{4})))|" +
      "([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]\\d{3}\\d{1,3}[领])|" +
      "([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$";

  /**
   * 社会统一信用代码
   */
  static readonly REG_CREDIT_CODE =
    "^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$";

  /**
   * 车架号(车辆识别代号)
   */
  static readonly REG_CAR_VIN =
    "^[A-HJ-NPR-Z0-9]{8}[0-9X][A-HJ-NPR-Z0-9]{2}\\d{6}$";

  /**
   * 驾驶证档案编号(中国驾驶证档案编号)
   */
  static readonly REG_CAR_DRIVING_LICENCE = "^[0-9]{12}$";

  /**
   * 中文姓名
   */
  static readonly REG_CHINESE_NAME = "^[\u2E80-\u9FFF·]{2,60}$";

  /**
   * 匹配表情符号(包括单个和组合表情)
   */
  static readonly REG_EMOJI =
    "(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])";

  /**
   * 判断内容是否匹配指定正则
   * @param content 待验证的内容
   * @param pattern 正则表达式
   * @returns 是否匹配
   */
  private static isMatch(content: string | null | undefined, pattern: string): boolean {
    if (!content) return false;
    const regex = new RegExp(pattern);
    return regex.test(content);
  }

  /**
   * 判断邮箱格式是否正确
   * @param content 邮箱地址
   * @returns 是否匹配
   */
  static isEmail(content: string): boolean {
    return RegexUtil.isMatch(content, RegexUtil.REG_EMAIL);
  }

  /**
   * 判断是否包含表情符号
   * @param content 待验证的内容
   * @returns 是否包含表情
   */
  static containsEmoji(content: string): boolean {
    return RegexUtil.isMatch(content, RegexUtil.REG_EMOJI);
  }

  /**
   * 判断电话号码格式是否正确
   * @param phone 电话号码
   * @returns 是否匹配
   */
  static isPhone(phone: string): boolean {
    return FormatUtil.isPhone(phone);
  }
}
相关推荐
Chrome深度玩家1 小时前
谷歌翻译安卓版拍照翻译精准度与语音识别评测【轻松交流】
android·人工智能·语音识别
长点点1 小时前
从架构角度了解安卓APP(1):安卓核心组件的设计逻辑与演进
android·架构·app
用户71887350336801 小时前
Android适配最新SplashScreen方案
android·android jetpack
EQ-雪梨蛋花汤2 小时前
【Part 2安卓原生360°VR播放器开发实战】第二节|基于等距圆柱投影方式实现全景视频渲染
android·音视频·vr
Railshiqian2 小时前
Framework.jar里的类无法通过Class.forName反射某个类的问题排查
android·反射·framework.jar
Huang兄3 小时前
鸿蒙-使用Charles抓包
harmonyos
CZIDC3 小时前
[特殊字符][特殊字符] HarmonyOS相关实现原理聊聊![特殊字符][特殊字符]
华为·harmonyos
别说我什么都不会3 小时前
【仓颉三方库】算法类—— flexSearch4cj
harmonyos