2017-02-12 52 views
0

我试图从VBAVB.NET迁移一个正则表达式(实用程序)的库,因为(我的总体印象是)它提供了更多支持获得“干净”和可重复使用的代码(包括Regex支持)。VBA到VB.NET - 正则表达式 - System.Text.RegularExpressions - 没有全局修饰符

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

然而,System.Text.RegularExpressionsRegEx对象没有一个干净的系统指定flags/modifiers ......

' 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??? 

正如我不认为这是一个不对这部分代码的改进,我将依靠应用inline modifiers代替(these here)(直接嵌入到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例子所示,命名空间System.Text.RegularExpressionsRegEx对象似乎不让你改变全球匹配修饰符(和inline modifiers,逻辑上,不包括global match flag)。

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

+0

只是假设'MatchGlobal'永远是真的 - 'System.Text。RegularExpressions'没有限制结果集到第一个匹配的概念。只需使用第一场比赛即可。 – Comintern

+0

@Comintern:谢谢你的回答。好吧,我看到了......但是,这似乎并不是一个最佳的解决方案......因为它每次都会获取所有找到的记录,即使您刚需要第一场比赛时也是如此 – rellampec

+0

然后,只需编写您的快递单以便匹配第一个例子 - 即以一行起始行锚'^'。 – Comintern

回答

1

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

为了仅获得第一(一个)匹配使用Regex.Match

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

要匹配所有实例,使用Regex.Matches

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

您需要实现的逻辑:如果所有比赛都预计,引发Regex.Matches,如果只有一个,用Regex.Match

+0

好吧,这是有道理的(就实施而言)......尽管我仍不明白他们为什么没有遵循关于全局修饰符的正则表达式规范。谢谢你的回答Wiktor。 – rellampec