Perl条件正则匹配逻辑如何转换为更简洁的VB.NET等效实现
可以实现,核心思路是直接调用Match方法,通过返回的Match对象的Success属性判断匹配结果,无需提前调用IsMatch,即可做到每个正则仅执行一次匹配,且仅按顺序执行到匹配成功的规则为止,无多余性能开销。
简化写法示例
如果正则需要复用,推荐预先初始化正则实例,写法如下:
' 预先定义正则实例,仅初始化一次,常用正则可加RegexOptions.Compiled提升复用性能 Dim re1 As New Regex("(pattern1)(pattern2)", RegexOptions.Compiled) Dim re2 As New Regex("(pattern3)(pattern4)", RegexOptions.Compiled) Dim re3 As New Regex("(pattern5)(pattern6)", RegexOptions.Compiled) Dim m As Match m = re1.Match(myvar) If m.Success Then var1 = m.Groups(1).Value var2 = m.Groups(2).Value ElseIf (m = re2.Match(myvar)).Success Then ' 匹配成功后的业务逻辑 ElseIf (m = re3.Match(myvar)).Success Then ' 匹配成功后的业务逻辑 End If
如果使用VB 14及以上版本,还支持内联声明匹配变量,写法更简洁,更接近Perl的行内匹配效果:
If (Dim m1 = re1.Match(myvar)).Success Then var1 = m1.Groups(1).Value var2 = m1.Groups(2).Value ElseIf (Dim m2 = re2.Match(myvar)).Success Then ' 对应业务逻辑 ElseIf (Dim m3 = re3.Match(myvar)).Success Then ' 对应业务逻辑 End If
性能说明
- 每个正则最多执行一次匹配操作,完全避免重复匹配的开销
- 匹配逻辑按判断顺序执行,只要前置规则匹配成功,后续正则完全不会运行,不会产生不必要的性能浪费
- 对于高频复用的正则,添加
RegexOptions.Compiled参数可以将正则编译为IL代码,大幅提升后续匹配的执行效率
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

