VB.NET 正则表达式完全指南

VB.NET 正则表达式完全指南

VB.NET通过 System.Text.RegularExpressions 命名空间提供正则表达式支持。本指南将详细介绍VB.NET中正则表达式的使用方法、性能优化和最佳实践。

1. 基础知识

1.1 导入命名空间

Imports System.Text.RegularExpressions

1.2 基本使用

Public Class RegexBasicsPublic Sub BasicExamples()Dim text As String = "Hello, my phone is 123-456-7890"' 创建正则表达式对象Dim regex As New Regex("\d+")' 检查是否匹配Dim isMatch As Boolean = regex.IsMatch(text)' 查找第一个匹配Dim match As Match = regex.Match(text)If match.Success ThenConsole.WriteLine($"Found: {match.Value}")End If' 查找所有匹配Dim matches As MatchCollection = regex.Matches(text)For Each m As Match In matchesConsole.WriteLine($"Found: {m.Value}")NextEnd Sub
End Class

1.3 正则表达式选项

Public Class RegexOptionsPublic Sub OptionsExample()' 不区分大小写Dim caseInsensitive As New Regex("hello", RegexOptions.IgnoreCase)' 多行模式Dim multiline As New Regex("^start", RegexOptions.Multiline)' 忽略空白字符和注释Dim ignored As New Regex("\d+  # 匹配数字\s*  # 可选的空白字符\w+  # 匹配单词", RegexOptions.IgnorePatternWhitespace)' 编译正则表达式以提高性能Dim compiled As New Regex("\d+", RegexOptions.Compiled)End Sub
End Class

2. 正则表达式语法

2.1 字符匹配

Public Class CharacterMatchingPublic Sub MatchingExamples()Dim text As String = "VB.NET 2022 is awesome! Price: $99.99"' 匹配数字Dim digits As New Regex("\d+")For Each m As Match In digits.Matches(text)Console.WriteLine($"Number: {m.Value}")Next' 匹配单词Dim words As New Regex("\w+")Dim wordMatches = words.Matches(text).Cast(Of Match)().Select(Function(m) m.Value).ToList()' 匹配空白字符Dim parts() As String = Regex.Split(text, "\s+")' 自定义字符类Dim vowels As New Regex("[aeiou]", RegexOptions.IgnoreCase)Dim vowelMatches = vowels.Matches(text).Cast(Of Match)().Select(Function(m) m.Value).ToList()End Sub
End Class

2.2 分组和捕获

Public Class GroupingExamplePublic Sub GroupExamples()Dim text As String = "John Smith, Jane Doe, Bob Johnson"' 基本分组Dim regex As New Regex("(\w+)\s(\w+)")For Each match As Match In regex.Matches(text)Console.WriteLine($"Full name: {match.Groups(0).Value}")Console.WriteLine($"First name: {match.Groups(1).Value}")Console.WriteLine($"Last name: {match.Groups(2).Value}")Next' 命名分组Dim namedRegex As New Regex("(?<first>\w+)\s(?<last>\w+)")For Each match As Match In namedRegex.Matches(text)Console.WriteLine($"First: {match.Groups("first").Value}")Console.WriteLine($"Last: {match.Groups("last").Value}")NextEnd Sub
End Class

3. 高级特性

3.1 替换操作

Public Class ReplacementOperationsPublic Function ReplaceExample(text As String) As String' 简单替换Dim result1 As String = Regex.Replace(text, "\d+", "X")' 使用委托Dim result2 As String = Regex.Replace(text, "\d+", _Function(match As Match)Dim number As Integer = Integer.Parse(match.Value)Return (number * 2).ToString()End Function)' 使用命名组的替换Dim regex As New Regex("(?<first>\w+)\s(?<last>\w+)")Dim result3 As String = regex.Replace(text, "${last}, ${first}")Return result3End Function
End Class

3.2 前瞻和后顾

Public Class LookAroundExamplePublic Sub LookAroundDemo()Dim text As String = "Price: $100, Cost: $50"' 正向前瞻Dim positiveAhead As New Regex("\d+(?=\s*dollars)")' 负向前瞻Dim negativeAhead As New Regex("\d+(?!\s*dollars)")' 正向后顾Dim positiveBehind As New Regex("(?<=\$)\d+")' 负向后顾Dim negativeBehind As New Regex("(?<!\$)\d+")End Sub
End Class

4. 实用工具类

4.1 验证器

Public Class ValidatorPrivate Shared ReadOnly EmailRegex As New Regex("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$",RegexOptions.Compiled)Private Shared ReadOnly PhoneRegex As New Regex("^1[3-9]\d{9}$",RegexOptions.Compiled)Private Shared ReadOnly PasswordRegex As New Regex("^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$",RegexOptions.Compiled)Public Shared Function IsValidEmail(email As String) As BooleanIf String.IsNullOrEmpty(email) Then Return FalseReturn EmailRegex.IsMatch(email)End FunctionPublic Shared Function IsValidPhone(phone As String) As BooleanIf String.IsNullOrEmpty(phone) Then Return FalseReturn PhoneRegex.IsMatch(phone)End FunctionPublic Shared Function IsValidPassword(password As String) As BooleanIf String.IsNullOrEmpty(password) Then Return FalseReturn PasswordRegex.IsMatch(password)End Function
End Class

4.2 文本处理器

Public Class TextProcessorPrivate Shared ReadOnly UrlRegex As New Regex("https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+[^\s]*",RegexOptions.Compiled)Private Shared ReadOnly HtmlTagRegex As New Regex("<[^>]+>",RegexOptions.Compiled)Public Shared Function ExtractUrls(text As String) As IEnumerable(Of String)If String.IsNullOrEmpty(text) Then Return Enumerable.Empty(Of String)Return UrlRegex.Matches(text).Cast(Of Match)().Select(Function(m) m.Value)End FunctionPublic Shared Function StripHtmlTags(html As String) As StringIf String.IsNullOrEmpty(html) Then Return String.EmptyReturn HtmlTagRegex.Replace(html, String.Empty)End FunctionPublic Shared Function CleanWhitespace(text As String) As StringIf String.IsNullOrEmpty(text) Then Return String.EmptyReturn Regex.Replace(text.Trim(), "\s+", " ")End Function
End Class

5. 性能优化

5.1 静态编译正则表达式

Public Class RegexOptimization' 使用共享字段存储编译后的正则表达式Private Shared ReadOnly CompiledRegex As New Regex("\d+",RegexOptions.Compiled)' 使用延迟初始化Private Shared ReadOnly LazyRegex As New Lazy(Of Regex)(Function() New Regex("\d+", RegexOptions.Compiled))Public Sub OptimizedExample()' 使用编译后的正则表达式Dim isMatch As Boolean = CompiledRegex.IsMatch("123")' 使用延迟初始化的正则表达式Dim lazyMatch As Boolean = LazyRegex.Value.IsMatch("123")End Sub
End Class

5.2 性能考虑

Public Class PerformanceConsiderations' 1. 使用适当的选项Private Shared ReadOnly FastRegex As New Regex("\d+",RegexOptions.Compiled Or RegexOptions.ExplicitCapture)' 2. 避免过度使用通配符Private Shared ReadOnly BetterRegex As New Regex("[^/]*foo[^/]*",  ' 比 .*foo.* 更高效RegexOptions.Compiled)' 3. 使用非捕获组Private Shared ReadOnly NonCapturingRegex As New Regex("(?:\d+)(?:[a-z]+)",  ' 使用(?:)表示非捕获组RegexOptions.Compiled)
End Class

6. 异常处理

Public Class RegexExceptionHandlingPublic Shared Function CreateSafeRegex(pattern As String) As RegexTryReturn New Regex(pattern, RegexOptions.Compiled)Catch ex As ArgumentExceptionThrow New ArgumentException($"Invalid regex pattern: {ex.Message}", ex)End TryEnd FunctionPublic Shared Function SafeIsMatch(input As String, pattern As String) As BooleanTryReturn Regex.IsMatch(input, pattern)Catch ex As RegexMatchTimeoutExceptionConsole.WriteLine($"Regex matching timed out: {ex.Message}")Return FalseCatch ex As ArgumentExceptionConsole.WriteLine($"Invalid regex pattern: {ex.Message}")Return FalseEnd TryEnd Function
End Class

7. 单元测试

<TestClass>
Public Class ValidatorTests<TestMethod>Public Sub TestEmailValidation()Assert.IsTrue(Validator.IsValidEmail("test@example.com"))Assert.IsTrue(Validator.IsValidEmail("user@domain.co.uk"))Assert.IsFalse(Validator.IsValidEmail("invalid.email"))Assert.IsFalse(Validator.IsValidEmail("@domain.com"))End Sub<TestMethod>Public Sub TestPhoneValidation()Assert.IsTrue(Validator.IsValidPhone("13812345678"))Assert.IsFalse(Validator.IsValidPhone("12345678"))Assert.IsFalse(Validator.IsValidPhone("2381234567"))End Sub<TestMethod>Public Sub TestTextProcessing()Dim html As String = "<p>Hello</p><div>World</div>"Assert.AreEqual("HelloWorld",TextProcessor.StripHtmlTags(html))Dim text As String = "  multiple   spaces   here  "Assert.AreEqual("multiple spaces here",TextProcessor.CleanWhitespace(text))End Sub
End Class

总结

VB.NET的正则表达式实现具有以下特点:

  1. 完整的.NET正则表达式引擎支持
  2. 编译选项提供高性能
  3. LINQ集成
  4. 完整的Unicode支持

最佳实践:

  1. 使用共享(Shared)编译的Regex对象提高性能
  2. 合理使用RegexOptions
  3. 处理超时和异常情况
  4. 编写完整的单元测试
  5. 使用命名捕获组提高可读性

注意事项:

  1. Regex对象创建开销大,应该重用
  2. 考虑使用Compiled选项提高性能
  3. 处理RegexMatchTimeoutException
  4. 注意内存使用

记住:在VB.NET中使用正则表达式时,要充分利用.NET框架提供的功能。VB.NET的语法可能与C#略有不同,但底层的正则表达式引擎是相同的。合理使用静态编译和缓存可以显著提高性能。

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

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

相关文章

易语言文字识别OCR

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

Docker 镜像制作原理 做一个自己的docker镜像

一.手动制作镜像 启动容器进入容器定制基于容器生成镜像 1.启动容器 启动容器之前我们首先要有一个镜像&#xff0c;这个镜像可以是从docker拉取&#xff0c;例如&#xff1a;现在pull一个ubuntu镜像到本机。 docker pull ubuntu:22.04 我们接下来可以基于这个容器进行容器…

网络编程 - - TCP套接字通信及编程实现

概述 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。在网络编程中&#xff0c;TCP常用于实现客户端和服务器之间的可靠数据传输。本文将基于C语言实现TCP服务端和客户端建立通信的过程。 三次握手 在…

近红外简单ROI分析matlab(NIRS_SPM)

本次笔记主要想验证上篇近红外分析是否正确&#xff0c;因为叠加平均有不同的计算方法&#xff0c;一种是直接将每个通道的5分钟实时长单独进行叠加平均&#xff0c;另一种是将通道划分为1分钟的片段&#xff0c;将感兴趣的通道数据进行对应叠加平均&#xff0c;得到一个总平均…

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》&#xff0c;让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识&#xff0c;顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话&#xff0c;可以看看博主的C语言专栏哟&#xff…

Python调用go语言编译的库

要在 Python 中调用用 Go 语言编写的库&#xff0c;可以使用 Go 语言的 cgo 特性将 Go 代码编译成共享库&#xff08;如 .so 文件&#xff09;&#xff0c;然后在 Python 中通过 ctypes 或 cffi 模块加载和调用这个共享库。 新建main.go文件&#xff0c;使用go语言编写如下代码…

学成在线_内容管理模块_创建模块工程

学成在线模块工程 1.各个微服务依赖基础工程2.每个微服务都是一个前后端分离的项目3.xuecheng-plus-content&#xff1a;内容管理模块工程xuecheng-plus-content-modelxuecheng-plus-content-servicexuecheng-plus-content-api 1.各个微服务依赖基础工程 2.每个微服务都是一个前…

1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)

目录 01. Java中的集合体系 02. 单列集合体系​ 1. Collection系列集合的遍历方式 &#xff08;1&#xff09;迭代器遍历&#xff08;2&#xff09;增强for遍历​编辑&#xff08;3&#xff09;Lambda表达式遍历 03.List集合详解 04.Set集合详解 05.总结 Collection系列…

智能科技与共情能力加持,哈曼重新定义驾乘体验

2025年1月6日&#xff0c;拉斯维加斯&#xff0c;2025年国际消费电子展——想象一下&#xff0c;当您步入一辆汽车&#xff0c;它不仅能响应您的指令&#xff0c;更能理解您的需求、适应您的偏好&#xff0c;并为您创造一个独特且专属的交互环境。作为汽车科技领域的知名企业和…

Unity中实现倒计时结束后干一些事情

问题描述&#xff1a;如果我们想实现在一个倒计时结束后可以执行某个方法&#xff0c;比如挑战成功或者挑战失败&#xff0c;或者其他什么的比如生成boss之类的功能&#xff0c;而且你又不想每次都把代码复制一遍&#xff0c;那么就可以用下面这种方法。 结构 实现步骤 创建一…

从0开始学习搭网站第二天

前言&#xff1a;今天比较惭愧&#xff0c;中午打铲吃了一把&#xff0c;看着也到钻二了&#xff0c;干脆顺手把这个赛季的大师上了&#xff0c;于是乎一直到网上才开始工作&#xff0c;同样&#xff0c;今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…

STM32 FreeRTOS时间片调度---FreeRTOS任务相关API函数---FreeRTOS时间管理

目录 时间片调度简介 FreeRTOS任务相关API函数介绍 延时函数介绍 时间片调度简介 在FreeRTOS中&#xff0c;同等优先级的任务会轮流分享相同的CPU时间&#xff0c;这个时间被称为时间片。在这里&#xff0c;一个时间片的长度等同于SysTick中断的周期。 FreeRTOS任务相关API…

VM(虚拟机)和Linux的安装

文章目录 1.虚拟机1.1 VM的安装和删除1.1.1 安装前提1.1.2 安装步骤 1.2 虚拟机快照1.3 虚拟机的克隆 2.Linux的安装2.1 CentOS2.2 Ubuntu 1.虚拟机 &#xff08;1&#xff09;Linux系统的安装方式 ①物理机安装&#xff1a;直接将操作系统安装到服务器硬件上 ②虚拟机安装&am…

C++算法第十五天

复习周终于结束了&#xff0c;这也是复习周结束后的第一篇文章&#xff0c;请各位小伙伴们细细品尝&#xff0c;废话不多说&#xff0c;我们开始今天的讲解。 第一题 题目链接 918. 环形子数组的最大和 - 力扣&#xff08;LeetCode&#xff09; 题目解析 代码原理 注意&…

mysql-5.7.18保姆级详细安装教程

本文主要讲解如何安装mysql-5.7.18数据库&#xff1a; 将绿色版安装包mysql-5.7.18-winx64解压后目录中内容如下图&#xff0c;该例是安装在D盘根目录。 在mysql安装目录中新建my.ini文件&#xff0c;文件内容及各配置项内容如下图&#xff0c;需要先将配置项【skip-grant-tab…

<OS 有关>Ubuntu 24 安装 openssh-server, tailscale+ssh 慢增加

更新日志&#xff1a; Created on 14Jan.2025 by Dave , added openssh-server, tailescape Updated on 15Jan.2025, added "tailescape - tailscape ssh" 前期准备&#xff1a; 1. 更新可用软件包的数据库 2. 升级系统中所有已安装的软件包到最新版本 3. 安装 cur…

STM32-keil安装时遇到的一些问题以及解决方案

前言&#xff1a; 本人项目需要使用到STM32,故需配置keil 5&#xff0c;在配置时遇到了以下问题&#xff0c;并找到相应的解决方案&#xff0c;希望能够为遇到相同问题的道友提供一些解决思路 1、提示缺少&#xff08;missing&#xff09;version 5编译器 step1&#xff1a;找…

HTTP1.0/1.1/2.0/3.0 的区别?

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是用于传输超文本的协议。各版本的主要区别体现在性能优化、数据传输方式以及支持的功能上。 每一次协议的更新都是对旧协议的改进&#xff1a; 1. HTTP1.0 发布于1996年 无连接&#xff08;Connectionless&#…

蓝桥杯_B组_省赛_2022(用作博主自己学习)

题目链接算法11.九进制转十进制 - 蓝桥云课 进制转换 21.顺子日期 - 蓝桥云课 时间与日期 31.刷题统计 - 蓝桥云课 时间与日期 41.修剪灌木 - 蓝桥云课 思维 51.X 进制减法 - 蓝桥云课 贪心 61.统计子矩阵 - 蓝桥云课 二维前缀和 71.积木画 - 蓝桥云课 动态规划 82.扫雷 - 蓝桥…

C++|CRC校验总结

参考&#xff1a; Vector - CAPL - CRC算法介绍 开发工具 > CRC校验工具 文章目录 简介CRC-8CRC-16CRC-32 简介 循环冗余校验&#xff08;Cyclic Redundancy Check&#xff0c;简称CRC&#xff09;是一种数据校验算法&#xff0c;广泛用于检测数据传输或存储过程中的错误。…