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
英文地址,請注明出處:http://en.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值&#…