我正在尝试将正则表达式(实用程序)的库从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
)。
关于如何处理它的任何想法?
答案 0 :(得分:1)
不支持global
正则表达式选项,因为此行为是通过两种不同的方法实现的。
要仅使用Regex.Match
获得第一个(一个)匹配:
在指定的输入字符串中搜索Regex构造函数中指定的第一次出现的正则表达式。
要匹配所有匹配项,请使用Regex.Matches
:
在输入字符串中搜索所有正则表达式,并返回所有匹配项。
您需要实现逻辑:如果预期所有匹配,则触发Regex.Matches
,如果只有一个匹配,则使用Regex.Match
。