C# VB.NET取字符串中全角字符数量和半角字符数量

C# VB.NET中Tuple轻量级数据结构和固定长度数组-CSDN博客
https://blog.csdn.net/xiaoyao961/article/details/148872196

下面提供了三种统计字符串中全角和半角字符数量的方法,并进行了性能对比。

 性能对比(处理 100 万次 "Hello,世界!123456")

方法执行时间(毫秒)相对性能
方法三:位运算~150100%
方法二:字符遍历~25060%
方法一:正则表达式~150010%

推荐方案

如果追求极致性能(如处理大文本),使用方法三位运算(方法4):

Public Function CountFullAndHalfWidthCharacters(input As String) As Tuple(Of Integer, Integer)Dim full, half As IntegerFor Each c As Char In inputDim code = Convert.ToInt32(c)If (code - &H20 And &HFFFFFF80) = 0 OrElse (code - &HFF61 And &HFFFFFFC0) = 0 Thenhalf += 1 Else full += 1End IfNextReturn Tuple.Create(full, half)
End Function

方法一:正则表达式(代码简洁但性能一般)

Imports System.Text.RegularExpressionsPublic Function CountFullAndHalfWidthCharacters_Regex(input As String) As Tuple(Of Integer, Integer)Dim fullWidthCount = Regex.Matches(input, "[^\u0020-\u007E\uFF61-\uFF9F]").CountDim halfWidthCount = Regex.Matches(input, "[\u0020-\u007E\uFF61-\uFF9F]").CountReturn Tuple.Create(fullWidthCount, halfWidthCount)
End Function

方法二:字符遍历 + Unicode 范围判断(性能较好)

Public Function CountFullAndHalfWidthCharacters_Loop(input As String) As Tuple(Of Integer, Integer)Dim fullWidthCount As Integer = 0Dim halfWidthCount As Integer = 0For Each c As Char In inputIf (c >= &H20 AndAlso c <= &H7E) OrElse (c >= &HFF61 AndAlso c <= &HFF9F) ThenhalfWidthCount += 1ElsefullWidthCount += 1End IfNextReturn Tuple.Create(fullWidthCount, halfWidthCount)
End Function

方法三:字符遍历 + 位运算(性能最优)

Public Function CountFullAndHalfWidthCharacters_Bitwise(input As String) As Tuple(Of Integer, Integer)Dim fullWidthCount As Integer = 0Dim halfWidthCount As Integer = 0For Each c As Char In inputDim code As Integer = Convert.ToInt32(c)If (code - &H20 And &HFFFFFF80) = 0 OrElse (code - &HFF61 And &HFFFFFFC0) = 0 ThenhalfWidthCount += 1ElsefullWidthCount += 1End IfNextReturn Tuple.Create(fullWidthCount, halfWidthCount)
End Function

如果需要代码简洁且性能可接受,使用方法二字符遍历:

Public Function CountFullAndHalfWidthCharacters(input As String) As Tuple(Of Integer, Integer)Dim full, half As IntegerFor Each c As Char In inputIf (c >= &H20 AndAlso c <= &H7E) OrElse (c >= &HFF61 AndAlso c <= &HFF9F) Thenhalf += 1 Else full += 1End IfNextReturn Tuple.Create(full, half)
End Function

位运算方案通过消除条件分支和直接操作整数,在大数据量下比正则表达式快 10 倍以上,比字符范围判断快约 40%。

在VB.NET里,你可以借助正则表达式以及 Unicode 编码范围来区分全角字符与半角字符。下面有一个示例函数,能够统计字符串里全角字符和半角字符的数量:

Imports System.Text.RegularExpressionsPublic Function CountFullAndHalfWidthCharacters(input As String) As Tuple(Of Integer, Integer)' 定义全角字符的正则表达式模式Dim fullWidthPattern As New Regex("[^\u0020-\u007E\uFF61-\uFF9F]")' 定义半角字符的正则表达式模式Dim halfWidthPattern As New Regex("[\u0020-\u007E\uFF61-\uFF9F]")' 统计全角字符数量Dim fullWidthCount As Integer = fullWidthPattern.Matches(input).Count' 统计半角字符数量Dim halfWidthCount As Integer = halfWidthPattern.Matches(input).Count' 返回结果元组Return Tuple.Create(fullWidthCount, halfWidthCount)
End Function

代码解释

  1. 全角字符的判断:全角字符一般处于非 ASCII 范围,像中文、日文、韩文的文字以及全角标点符号都属于此类。此函数把 Unicode 范围 \u0020-\u007E(基本 ASCII 字符)和 \uFF61-\uFF9F(半角片假名)以外的字符都判定为全角字符。
  2. 半角字符的判断:半角字符主要涵盖基本 ASCII 字符以及半角片假名,其 Unicode 范围是 \u0020-\u007E 和 \uFF61-\uFF9F
  3. 结果的返回:函数会返回一个元组,其中包含全角字符数量和半角字符数量。

使用示例vb

Dim input As String = "Hello,世界!123456"
Dim result = CountFullAndHalfWidthCharacters(input)Console.WriteLine($"全角字符数量: {result.Item1}")  ' 输出: 5
Console.WriteLine($"半角字符数量: {result.Item2}")  ' 输出: 9

这个函数能够有效地区分全角和半角字符,不过在处理某些特殊字符时可能会存在一些局限,你可以依据具体的需求对正则表达式模式进行调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86728.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CC++公司面试题[个人总结,持续更新中]

嵌入式初级面试题 姓名: 日期: 开始时间: (答题时间60分钟,答题过程中请不要上网查询资料,不可带走答卷) 1:设float a=2,b=4,c=3;,以下C语言表达式与代数式(a+b)+c计算结果不一致的是( )[3分] A.(a+b)c/2 B. (1/2)*(a+b)c C. (a+b)c*1/2 D.c/2(a+b) 2:为了向二进制文件尾部…

Qt QGraphics简述及例程 - QGraphicsView、QGraphicsScene和QGraphicsItem

Qt QGraphics简述及例程 引言一、简单例程二、关于坐标系问题 引言 QGraphics*是Qt框架中&#xff0c;主要用于处理2D图形项的显示、交互和管理的模块&#xff0c;包括QGraphicsView、QGraphicsScene和QGraphicsItem。提供了一套高效的场景-视图架构&#xff0c;适合开发复杂的…

代码随想录打卡第一天

文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode&#xff1a;704. 二分查找_哔哩哔哩_bilibili class Solution { public:int search(vector<int>& nums, int target) {int left0;//左边界int…

时序数据库全面解析与对比

文章目录 1. 时序数据库概述1.1 时序数据特点1.2 时序数据库核心功能 2. 主流时序数据库对比2.1 InfluxDB2.2 Prometheus2.3 TimescaleDB2.4 OpenTSDB2.5 TDengine 3. 全方位对比3.1 功能对比3.2 性能对比3.3 适用场景对比3.4 社区与生态 4. 选型建议4.1 根据数据规模选择4.2 根…

【STM32CubeMX】ST官网MCU固件库下载及安装

用STM32CubeMX自带的Updater更新固件包会遇到各种幺蛾子&#xff08;如下图所示&#xff09;&#xff0c;所以干脆自己下载固件包&#xff0c;快速升级固件。 1. ST官网搜索你需要的MCU型号&#xff0c;并选择需要的固件版本&#xff0c;我这里是H7的MCU所以就找H7&#xff08;…

青少年编程与数学 01-012 通用应用软件简介 13 网上学习资源

青少年编程与数学 01-012 通用应用软件简介 13 网上学习资源 一、什么是网上学习资源&#xff08;一&#xff09;网上学习资源的基本定义&#xff08;二&#xff09;网上学习资源的工作原理&#xff08;三&#xff09;网上学习资源的类型 二、网上学习资源的重要意义&#xff0…

Python Selenium 忽略证书错误

文章目录 Python Selenium 忽略证书错误和忽略&#x1f527; **一、忽略 SSL 证书错误**1. **基础配置&#xff08;适用于 Chrome/Firefox&#xff09;**2. **高级场景&#xff1a;指定证书指纹**3. **浏览器兼容方案** &#x1f507; **二、隐藏 DevTools 监听提示**1. **禁用…

YOLOv8模型在RDK5开发板上的部署指南:.pt到.bin转换与优化实践

以下是针对在RDK5开发板(基于NVIDIA Jetson Orin平台)部署YOLOv8模型的详细技术指南,涵盖从模型转换、优化到部署的全流程: YOLOv8模型在RDK5开发板上的部署指南:.pt到.bin转换与优化实践 ——基于TensorRT的高性能嵌入式部署方案 第一章:技术背景与核心概念 1.1 RDK5开…

内网横向-工作流

一、信息收集阶段 操作 工具 / 命令 说明 系统基础信息采集 systeminfo、whoami /user 查看系统版本、用户 SID 等 域内用户 / 组查询 net user /domain、net group "domain admins" /domain 列出域用户及管理员组 域控及网络结构探测 nltest /dsgetdc、ip…

个人日记本小程序开发方案(使用IntelliJ IDEA)

个人日记本小程序开发方案(使用IntelliJ IDEA) 一、项目创建与环境配置 1. 新建项目 打开IDEA → New Project → JavaFX选择JDK 11+版本添加必要依赖:<!-- pom.xml --> <dependencies><dependency><groupId

react快速开始项目模板

代码仓库 gitee 创建项目 首先保证安装了node, 然后使用vite创建项目 vite npm create vite react-learn cd react-learn npm i 目录结构 一个完整的前端项目需要: 状态管理 在全局维护共有的状态(数据), 让页面组件之间共享数据, 我们使用pinia路由 路由让页面之间可以…

scrapy+django+pyecharts+mysql 实现西安游客行为分析系统大屏_用户画像_空间分析_路线智能推荐

项目地址 link 此处展示部分结果 思路 描述性统计 可视化大屏 用户画像&#xff08;聚类&#xff0c;情感分析&#xff09; 空间分析

AC-DC-AC间接变频电源设计方案(工频50Hz→20KHz)

AC-DC-AC间接变频电源设计方案(工频50Hz→20KHz) 一、方案分析与选择 1. 可选电路结构分析 方案1:二极管整流+Boost PFC+全桥逆变 优点: 输入功率因数高(>0.99)直流电压稳定可控输出波形质量好缺点: 电路复杂度较高成本相对较高方案2:晶闸管相控整流+电容滤波+半…

七天学完十大机器学习经典算法-09.梯度提升算法:预测艺术的精进之道

接上一篇《七天学完十大机器学习经典算法-08.K均值聚类&#xff1a;无监督学习的万能分箱术》 想象你在教一个学生解决复杂数学题&#xff1a;先让他做基础题&#xff0c;然后针对错误部分强化练习&#xff0c;再针对新错误继续训练...如此反复精进&#xff0c;直到完美掌握——…

数据库(MYsql)

一、Mysql概述 数据库&#xff1a;存储数据的仓库 &#xff0c;数据是有组织的进行存储 数据库管理系统&#xff1a;操纵和管理数据库的大型软件&#xff08;BBMS&#xff09; SQL&#xff1a;定义了一套操作关系型数据库统一标准&#xff0c;操作关系型数据库的编程语言 数…

【SpringBoot】Spring Boot + RESTful 技术实战指南

在当今的软件开发领域&#xff0c;Spring Boot 与 RESTful API 的结合已成为构建高效、可扩展 Web 应用的标配。本文将通过一个完整的项目示例&#xff0c;从知识铺垫到部署上线&#xff0c;带你一步步掌握 Spring Boot RESTful 的开发流程。 一、知识铺垫 1.1 Spring Boot …

安卓中静态和动态添加子 View 到容器

1.静态添加子View 在XML布局文件中直接定义子View&#xff1a; <!-- activity_main.xml --> <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/android"android:id"id/container"android:layout_width"match_parent"a…

【NLP】自然语言项目设计03

目录 03模型构建 代码架构核心设计说明 初步构建模型并进行训练时遇到的一些问题 问题一&#xff1a;模型欠拟合 使用1 model - lstm 解释使用lstm时无法正常的进行cudnn加速 使用2 model - transformer 项目简介 训练一个模型&#xff0c;实现歌词仿写生成 任务类型&am…

WebRTC(十二):DTLS

在 WebRTC 中的作用 DTLS&#xff08;Datagram Transport Layer Security&#xff09;是 TLS 的 UDP 版本&#xff0c;在 WebRTC 中用于&#xff1a; 安全协商加密密钥对等验证&#xff08;基于 X.509 证书 fingerprint&#xff09;为 SRTP/SRTCP 提供密钥材料 WebRTC 不直接…

北大肖臻《区块链技术与应用》学习笔记

区块链学习笔记 \huge{区块链学习笔记} 区块链学习笔记 这是关于北京大学肖臻老师的《区块链技术与应用》课程的学习笔记。 BTC的数据结构 hash pointers&#xff1a;既保存结构体的对应地址位置&#xff08;指针&#xff09;&#xff0c;又保存结构体对应映射的hash值&#…