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

news2025/1/16 21:03:00

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

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

1. 基础知识

1.1 导入命名空间

Imports System.Text.RegularExpressions

1.2 基本使用

Public Class RegexBasics
    Public 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 Then
            Console.WriteLine($"Found: {match.Value}")
        End If

        ' 查找所有匹配
        Dim matches As MatchCollection = regex.Matches(text)
        For Each m As Match In matches
            Console.WriteLine($"Found: {m.Value}")
        Next
    End Sub
End Class

1.3 正则表达式选项

Public Class RegexOptions
    Public 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 CharacterMatching
    Public 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 GroupingExample
    Public 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}")
        Next
    End Sub
End Class

3. 高级特性

3.1 替换操作

Public Class ReplacementOperations
    Public 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 result3
    End Function
End Class

3.2 前瞻和后顾

Public Class LookAroundExample
    Public 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 Validator
    Private 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 Boolean
        If String.IsNullOrEmpty(email) Then Return False
        Return EmailRegex.IsMatch(email)
    End Function

    Public Shared Function IsValidPhone(phone As String) As Boolean
        If String.IsNullOrEmpty(phone) Then Return False
        Return PhoneRegex.IsMatch(phone)
    End Function

    Public Shared Function IsValidPassword(password As String) As Boolean
        If String.IsNullOrEmpty(password) Then Return False
        Return PasswordRegex.IsMatch(password)
    End Function
End Class

4.2 文本处理器

Public Class TextProcessor
    Private 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 Function

    Public Shared Function StripHtmlTags(html As String) As String
        If String.IsNullOrEmpty(html) Then Return String.Empty
        Return HtmlTagRegex.Replace(html, String.Empty)
    End Function

    Public Shared Function CleanWhitespace(text As String) As String
        If String.IsNullOrEmpty(text) Then Return String.Empty
        Return 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 RegexExceptionHandling
    Public Shared Function CreateSafeRegex(pattern As String) As Regex
        Try
            Return New Regex(pattern, RegexOptions.Compiled)
        Catch ex As ArgumentException
            Throw New ArgumentException($"Invalid regex pattern: {ex.Message}", ex)
        End Try
    End Function

    Public Shared Function SafeIsMatch(input As String, pattern As String) As Boolean
        Try
            Return Regex.IsMatch(input, pattern)
        Catch ex As RegexMatchTimeoutException
            Console.WriteLine($"Regex matching timed out: {ex.Message}")
            Return False
        Catch ex As ArgumentException
            Console.WriteLine($"Invalid regex pattern: {ex.Message}")
            Return False
        End Try
    End 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.coloradmin.cn/o/2277702.html

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

相关文章

STC的51单片机LED点灯基于KEIL

前言&#xff1a; 该文源于回答一个朋友的问题&#xff0c;代码为该朋友上传&#xff0c;略作修改&#xff0c;在此说明问题以及解决问题的思路&#xff0c;以减少新手错误。 电路图&#xff1a; 该位朋友未上传电路图&#xff0c;说明如下&#xff1a; stc8g1k08a-sop8控制…

手撕Transformer -- Day6 -- DecoderBlock

手撕Transformer – Day6 – DecoderBlock 目录 手撕Transformer -- Day6 -- DecoderBlockTransformer 网络结构图DecoderBlock 代码Part1 库函数Part2 实现一个解码器Block&#xff0c;作为一个类Part3 测试 参考 Transformer 网络结构图 Transformer 网络结构 DecoderBlock 代…

【功能测试总结】

功能测试 1. 功能测试用例1.1 设计用例容易出现的问题 2. 如何写用例2.1 什么是好的用例2.2 测试用例设计常见方法 3. 用例分级 1. 功能测试用例 1.1 设计用例容易出现的问题 基础功能点用例覆盖不全/描述不清 描述不清 什么是正常内容&#xff0c;仅看用例能否知道该输入什么…

Mac玩Steam游戏秘籍!

Mac玩Steam游戏秘籍&#xff01; 大家好&#xff01;最近有不少朋友在用MacBook玩Steam游戏时遇到不支持mac的问题。别担心&#xff0c;我来教你如何用第三方工具Crossover来畅玩这些不支持的游戏&#xff0c;简单又实用&#xff01; 第一步&#xff1a;下载Crossover 首先&…

基于Springboot + vue实现的旅游网站

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

题解 CodeForces 430B Balls Game 栈 C/C++

题目传送门&#xff1a; Problem - B - Codeforceshttps://mirror.codeforces.com/contest/430/problem/B翻译&#xff1a; Iahub正在为国际信息学奥林匹克竞赛&#xff08;IOI&#xff09;做准备。有什么比玩一个类似祖玛的游戏更好的训练方法呢&#xff1f; 一排中有n个球…

Vue3播放视频报ReferenceError: SharedArrayBuffer is not defined

解决办法 前端本地测试vue.config.js server: {headers: {"Cross-Origin-Opener-Policy": "same-origin","Cross-Origin-Embedder-Policy": "require-corp",}, }, 后端vue.js生产环境 跨域隔离 是一种现代Web安全策略&#xff0c;…

Android BottomNavigationView不加icon使text垂直居中,完美解决。

这个问题网上千篇一律的设置iconsize为0&#xff0c;labale固定什么的&#xff0c;都没有效果。我的这个基本上所有人用都会有效果。 问题解决之前的效果&#xff1a;垂直方向&#xff0c;文本不居中&#xff0c;看着很难受 问题解决之后&#xff1a;舒服多了 其实很简单&…

微调神经机器翻译模型全流程

MBART: Multilingual Denoising Pre-training for Neural Machine Translation 模型下载 mBART 是一个基于序列到序列的去噪自编码器&#xff0c;使用 BART 目标在多种语言的大规模单语语料库上进行预训练。mBART 是首批通过去噪完整文本在多种语言上预训练序列到序列模型的方…

基于32QAM的载波同步和定时同步性能仿真,包括Costas环的gardner环

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 载波同步是…

设计模式-工厂模式/抽象工厂模式

工厂模式 定义 定义一个创建对象的接口&#xff0c;让子类决定实列化哪一个类&#xff0c;工厂模式使一个类的实例化延迟到其子类&#xff1b; 工厂方法模式是简单工厂模式的延伸。在工厂方法模式中&#xff0c;核心工厂类不在负责产品的创建&#xff0c;而是将具体的创建工作…

【机器学习】零售行业的智慧升级:机器学习驱动的精准营销与库存管理

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在当今数字化浪潮汹涌澎湃的时代&#xff0c;零售行业正站在转型升级的十字路口。市场竞争的白热化使得企业必须另辟蹊径&#xff0…

day_2_排序算法和树

文章目录 排序算法和树排序算法算法稳定性排序算法☆ 冒泡排序冒泡思路冒泡步骤代码实现效率优化 ☆ 选择排序排序思路排序步骤代码实现 ... 树01-树的基本概念02-树的相关术语03-二叉树的种类04-二叉树的存储05-树的应用场景_数据库索引06-二叉树的概念和性质07-广度优先遍历0…

蓝桥杯刷题第二天——背包问题

题目描述 有N件物品和一个容量是V的背包。每件物品只能使用一次。第i件物品的体积是Vi价值是Wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数&#xff0c;N&#xff0c;V&am…

Linux x86_64 程序动态链接之GOT 和 PLT

文章目录 前言一、动态链接二、位置无关代码三、GOT 和 PLT3.1 GOT3.2 PLT3.3 延时绑定3.4 示例 四、demo演示五、延迟绑定技术和代码修补参考资料 前言 这篇文章描述了&#xff1a;Linux x86_64 程序静态链接之重定位&#xff0c;接来本文描述Linux x86_64 程序动态链接之GOT…

学习记录-责任链模式验证参数

学习记录-责任链模式验证参数 1.什么是责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它允许将请求沿着一个处理链传递&#xff0c;直到链中的某个对象处理它。这样&#xff0c;发送者无需知道哪个对象将处理…

练习:MySQL单表查询与多表查询

一.单表查询 创建worke数据库&#xff0c;在数据库底下创建worker表 mysql> create database worke; Query OK, 1 row affected (0.00 sec)mysql> show databases; -------------------- | Database | -------------------- | information_schema | | mysql …

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (四、最近上映电影滚动展示及加载更多的实现)

在HarmonyOS NEXT开发环境中&#xff0c;可以使用多种组件和库来构建丰富且交互友好的应用。本文将展示如何使用HarmonyOS NEXT框架和nutpi/axios库&#xff0c;从零开始实现一个简单的影视APP的首页&#xff0c;主要关注最近上映电影的滚动展示及加载更多功能的实现。 开源项目…

卷积神经05-GAN对抗神经网络

卷积神经05-GAN对抗神经网络 使用Python3.9CUDA11.8Pytorch实现一个CNN优化版的对抗神经网络 简单的GAN图片生成 CNN优化后的图片生成 优化模型代码对比 0-核心逻辑脉络 1&#xff09;Anacanda使用CUDAPytorch2&#xff09;使用本地MNIST进行手写图片训练3&#xff09;…

客户案例:某家居制造企业跨境电商,解决业务端(亚马逊平台)、易仓ERP与财务端(金蝶ERP)系统间的业务财务数据对账互通

一、系统定义 1、系统定位&#xff1a; 数据中台系统是一种战略选择和组织形式&#xff0c;通过有型的产品支撑和实施方法论&#xff0c;解决企业面临的数据孤岛、数据维护混乱、数据价值利用低的问题&#xff0c;依据企业特有的业务和架构&#xff0c;构建一套从数据汇聚、开…