VBA到VB.NET - 正则表达式 - System.Text.RegularExpressions - 没有全局修饰符

时间:2017-02-12 02:04:11

标签: regex vb.net vba

我正在尝试将正则表达式(实用程序)的库从VBA迁移到VB.NET,因为(我的总体印象是)它为获得" clean&#34提供了更多支持;和可重复使用的代码(包括Regex支持)。

该库是factory pattern,可以重复使用compiled正则表达式(出于性能优化的目的;不确定选项RegexOptions.Compiled可以在哪个方面提供帮助)。它与Lib结合使用,它保存模式(实用程序)的记录并返回一个对象;除了pattern之外,还包括modifiers(作为属性)。

但是,RegEx的{​​{1}}对象没有干净的系统来指定System.Text.RegularExpressions / flags ......

modifiers

Versus

' VBA
Dim oRegExp As New RegExp
With oRegExp
    .Pattern = Pattern
    .IgnoreCase = IgnoreCase
    .Multiline = Multiline
    .Global = MatchGlobal
End With

由于我不认为这是对这部分代码的改进,我将依赖' VB.NET Dim opts As RegexOptions = New RegexOptions If IgnoreCase Then opts = opts Or RegexOptions.IgnoreCase If Multiline Then opts = opts Or RegexOptions.Multiline Dim oRegExp As RegEx oRegExp = New RegEx(Pattern, opts) 'Were can I specify MatchGlobal??? 来代替(these here)(直接嵌入到inline modifiers本身),并删除包含修饰符作为属性的模式库的对象(未包含在示例中)。

那样......

Pattern

唯一的问题是,如上面的' This -> "\bpre([^\r\n]+)\b" ' in .NET, can be this -> "\bpre(?<word>\w*)\b" ' as .NET supports named groups Dim Pattern as String = "(?i)\bpre(?<word>\w*)\b" ' case insensitive 示例所示,名称空间VB.NET RegEx对象似乎不是允许您更改全局匹配修饰符(和System.Text.RegularExpressions,逻辑上,不包括inline modifiers)。

关于如何处理它的任何想法?

1 个答案:

答案 0 :(得分:1)

不支持global 正则表达式选项,因为此行为是通过两种不同的方法实现的。

要仅使用Regex.Match获得第一个(一个)匹配:

  

在指定的输入字符串中搜索Regex构造函数中指定的第一次出现的正则表达式。

要匹配所有匹配项,请使用Regex.Matches

  

在输入字符串中搜索所有正则表达式,并返回所有匹配项。

您需要实现逻辑:如果预期所有匹配,则触发Regex.Matches,如果只有一个匹配,则使用Regex.Match